¿Cuál es la diferencia entre new
/ delete
y malloc
/ free
?
Relacionado (¿duplicado?): ¿En qué casos uso malloc vs nuevo?
c++
memory-management
MrDatabase
fuente
fuente
Respuestas:
nuevo / eliminar
malloc / gratis
Tabla de comparación de las características:
Técnicamente, la memoria asignada por new proviene del 'Free Store', mientras que la memoria asignada por malloc proviene del 'Heap'. Si estas dos áreas son iguales es un detalle de implementación, que es otra razón por la que malloc y new no se pueden mezclar.
fuente
If ptr is NULL, no operation is performed.
new
operador asigna memoria de la tienda libre (también conocida como memoria dinámica y el montón ). El Estándar C ++ 14, sección 3.7.4 sobre Almacenamiento dinámico dice "Los objetos se pueden crear dinámicamente durante la ejecución del programa (1.9), usando nuevas expresiones (5.3.4), y destruidos usando las expresiones de eliminación".La diferencia más relevante es que el
new
operador asigna memoria y luego llama al constructor, ydelete
llama al destructor y luego desasigna la memoria.fuente
new
llama al ctor del objeto,delete
llama al dtor.malloc
&free
simplemente asignar y liberar memoria en bruto.fuente
new
/delete
es C ++,malloc
/free
proviene del buen viejo C.En C ++,
new
llama a un constructor de objetos ydelete
llama al destructor.malloc
yfree
, viniendo de las edades oscuras antes de OO, solo asigna y libera la memoria, sin ejecutar ningún código del objeto.fuente
En C ++
new
/delete
llame al Constructor / Destructor en consecuencia.malloc
/free
simplemente asigne memoria del montón.new
/delete
asignar memoria también.fuente
Las únicas similitudes son que
malloc
/new
ambos devuelven un puntero que direcciona algo de memoria en el montón, y ambos garantizan que una vez que se haya devuelto dicho bloque de memoria, no se devolverá nuevamente a menos que lo libere / elimine primero. Es decir, ambos "asignan" memoria.Sin embargo,
new
/delete
realizar otro trabajo arbitrario además, a través de constructores, destructores y la sobrecarga de operadores.malloc
/free
solo asigna y libera memoria.De hecho,
new
es suficientemente personalizable que no necesariamente devuelve memoria del montón, ni siquiera asigna memoria en absoluto. Sin embargo, el valor predeterminadonew
sí.fuente
La principal diferencia entre new y malloc es que new invoca el constructor del objeto y la llamada correspondiente para eliminar invoca el destructor del objeto.
Hay otras diferencias:
new
es seguro para los tipos,malloc
devuelve objetos de tipovoid*
new
lanza una excepción por error,malloc
regresaNULL
y establece errnonew
es un operador y se puede sobrecargar,malloc
es una función y no se puede sobrecargarnew[]
, que asigna matrices, es más intuitivo y de tipo seguro quemalloc
malloc
las asignaciones derivadas pueden redimensionarse a través derealloc
, lasnew
asignaciones derivadas no pueden redimensionarsemalloc
puede asignar un fragmento de memoria de N bytes,new
se le debe pedir que asigne una matriz de, por ejemplo,char
tiposMirando las diferencias, un resumen es malloc es C-esque, nuevo es C ++ - esque. Use el que se siente bien para su base de código.
Aunque es legal que se implementen nuevos y malloc usando diferentes algoritmos de asignación de memoria, en la mayoría de los sistemas nuevos se implementan internamente usando malloc, sin generar diferencias en el nivel del sistema.
fuente
Hay algunas cosas que
new
hace quemalloc
no:new
construye el objeto llamando al constructor de ese objetonew
no requiere conversión de tipo de memoria asignada.Entonces, si usa
malloc
, entonces debe hacer las cosas por encima explícitamente, lo que no siempre es práctico. Además,new
se puede sobrecargar peromalloc
no se puede.En una palabra, si usa C ++, intente usar
new
tanto como sea posible.fuente
además,
el nuevo global y el borrado pueden anularse, malloc / free no.
Se pueden anular más nuevos y eliminar por tipo.
fuente
new
ydelete
son primitivas de C ++ que declaran una nueva instancia de una clase o la eliminan (invocando al destructor de la clase para la instancia).malloc
yfree
son funciones C y asignan y liberan bloques de memoria (en tamaño).Ambos usan el montón para hacer la asignación.
malloc
yfree
, sin embargo, son más "de bajo nivel", ya que solo reservan un trozo de espacio de memoria que probablemente se asociará con un puntero. No se crean estructuras alrededor de esa memoria (a menos que considere que una matriz C es una estructura).fuente
new y delete son operadores en c ++; que también se puede sobrecargar. malloc y free son función en c;
malloc devuelve ptr nulo cuando falla mientras que la nueva excepción de lanzamientos.
la dirección devuelta por malloc debe volverse a escribir por tipo, ya que devuelve el (void *) malloc (tamaño) Nueva devuelve el puntero escrito.
fuente
fuente
malloc()
, necesitamos incluir<stdlib.h>
o<alloc.h>
en el programa que no se requierenew
.new
ydelete
se puede sobrecargar peromalloc
no se puede.new
, podemos pasar la dirección donde queremos asignar memoria, pero esto no es posible en caso demalloc
.fuente
alloc.h
No es un encabezado estándar.<new>
se requiere para usar la colocación nueva.Este código para el uso de eliminar palabra clave o función libre. Pero cuando crea un objeto puntero usando 'malloc' o 'nuevo' y desasigna la memoria del objeto usando eliminar, incluso ese puntero de objeto puede ser llamado función en la clase. Después de eso, use free en lugar de delete, entonces también funciona después de la declaración free, pero cuando usa ambos, entonces solo el objeto puntero no puede llamar para funcionar en clase ... el código es el siguiente:
fuente
1.nuevo syntex es más simple que malloc ()
2.new/delete es un operador donde malloc () / free () es una función.
3.new/delete se ejecuta más rápido que malloc () / free () porque el compilador pega directamente el nuevo código ensamblador.
4. podemos cambiar el significado de nuevo / eliminar en el programa con la ayuda de la superposición del operador.
fuente