Cuál es la diferencia entre new
/delete
y malloc
/free
?
Relacionado (¿duplicado?): ¿En qué casos uso malloc vs new?
Sr. base de datos
Cuál es la diferencia entre new
/delete
y malloc
/free
?
Relacionado (¿duplicado?): ¿En qué casos uso malloc vs new?
new
/ delete
new
(versión estándar) nunca devuelve un NULL
(lanzará al fracaso).malloc
/ free
está definida la implementación.std::set_new_handler
).operator new
/ operator delete
puede anularse legalmente.malloc
/ free
void*
.NULL
sobre el fracasonew
/ delete
.malloc
/ free
lata NO anularse legalmente.Rasgo | new / delete |
malloc / free |
---|---|---|
Memoria asignada desde | ‘Tienda gratis’ | ‘Montón’ |
Devoluciones | Puntero completamente escrito | void* |
en caso de falla | Lanza (nunca regresa) NULL ) |
Devoluciones NULL |
Tamaño requerido | Calculado por el compilador | Debe especificarse en bytes |
Manejo de arreglos | Tiene una versión explícita. | Requiere cálculos manuales |
reasignación | No se maneja intuitivamente | Simple (sin constructor de copia) |
Llamada de reversa | Implementación definida | No |
Casos de poca memoria | Puede agregar un nuevo asignador de memoria | No manejado por código de usuario |
reemplazable | sí | No |
Uso de constructor / destructor | sí | No |
Técnicamente, la memoria asignada por new
proviene de la ‘Tienda gratuita’ mientras que la memoria asignada por malloc
proviene del ‘Montón’. 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 puede mezclar
¿Alguien puede editar para elaborar sobre la “Tienda gratuita” en lugar del montón? Un montón de procesos es un concepto bien conocido a nivel de sistema operativo independiente del idioma (?); ¿De dónde viene la “Tienda Gratis”?
– einpoklum
21 de febrero de 2016 a las 15:26
@einpoklum: Son solo nombres de áreas de memoria. Tampoco tiene nada que ver con el concepto de lenguaje conocido como “montón” o el concepto de sistema operativo de “montón de procesos”. C++ se define deliberadamente para ser plataforma/SO/compilador neutral. Por lo tanto, usar un concepto de sistema operativo específico como “montón de procesos” socavaría la flexibilidad del estándar.
– Martín York
21 de febrero de 2016 a las 17:06
@winterlight: Eso solía ser cierto, pero ya no. Ver: linux.die.net/man/3/free If ptr is NULL, no operation is performed.
– Martín York
19 de junio de 2016 a las 17:12
@LokiAstari Parece que ‘montón’, ‘almacenamiento gratuito’ y ‘memoria/almacenamiento dinámico’ son sinónimos: en Bjarne Stroustrup’s Un recorrido por C++dice “La new
El operador asigna memoria desde el tienda gratis (también conocido como memoria dinámica y 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 se pueden destruir usando eliminar-expresiones”.
–Max Heiber
7 de enero de 2017 a las 15:07
@mheiber: Significa que pueden ser iguales. Y varias implementaciones implementan new llamando a malloc (tenga en cuenta que al revés no está permitido explícitamente). Pero varias implementaciones mantienen esas áreas de memoria completamente separadas. La razón por la que también los mantuvo separados es que esto permite optimizar el código de administración de memoria de C++ de una manera diferente a la administración de memoria de C. El punto es: podrían ser lo mismo, pero no puedes asumir que lo son.
– Martín York
9 de enero de 2017 a las 17:43
Trampa
La diferencia más relevante es que el new
El operador asigna memoria y luego llama al constructor, y delete
llama al destructor y luego desasigna la memoria.
Estrictamente hablando, el nuevo operador solo asigna la memoria. Es la nueva expresión la que llama al nuevo operador y luego ejecuta el constructor en la memoria asignada.
–Don Wakefield
27 de octubre de 2008 a las 23:36
Otra diferencia es dónde se asigna la memoria. Hace poco vi en alguna parte que malloc/free opera en el montón, mientras que new/delete opera en otra área de la memoria cuyo nombre se me escapa ahora. (Sin embargo, baste decir que esa otra área probablemente se puede considerar como otro montón).
– RobH
30 de abril de 2009 a las 19:29
@mgb: Sí, tiene razón en que los objetos se asignan en el “montón de la aplicación” o en la pila. Pero @RobH se refiere a lo que el estándar llama diferentes partes del “Montón de aplicaciones”. Existe el “Montón”, que es desde donde malloc asigna memoria y “Free Store”, desde donde new asigna memoria. Aunque en algunos implementaciones estas áreas se superponen (este es un detalle de implementación).
– Martín York
28 de noviembre de 2009 a las 2:01
Su declaración es 100% correcta pero simplemente no responde la pregunta formulada, vea la respuesta a continuación, hay una razón por la cual tiene más votos que la suya.
– Murali
20 de enero de 2010 a las 16:58
Todo lo que estaba tratando de decir era que debería haber al menos alguna mención de malloc/free para que califique como una comparación de la que carecía su respuesta. Sin embargo, es una declaración relevante y precisa, por lo que los votos a favor, espero que entiendan mi punto. De todos modos, si SO me permitiera retirar mi voto negativo, lo haría de todo corazón.
– Murali
22 de enero de 2010 a las 3:06
new
llama al ctor del objeto, delete
llamar al dtor.
malloc
& free
simplemente asigne y libere memoria sin procesar.
¿A qué te refieres con memoria en bruto?
– Destructor
5 de enero de 2015 a las 15:50
A la memoria en bruto no se le ha hecho nada. Todavía no se ha construido ningún objeto en él, no se ha copiado nada en él y, en la mayoría de los casos, los contenidos anteriores no se han sobrescrito.
– James Curran
5 de enero de 2015 a las 23:04
Treb
new
/delete
es C++, malloc
/free
proviene del buen viejo C.
En C++, new
llama a un constructor de objetos y delete
llama al destructor.
malloc
y free
provenientes de la edad oscura antes de OO, solo asignan y liberan la memoria, sin ejecutar ningún código del objeto.
encriptado
En C++ new
/delete
llamar al Constructor/Destructor en consecuencia.
malloc
/free
simplemente asigne memoria del montón. new
/delete
asignar memoria también.
Pato Donald
La principal diferencia entre new y malloc es que new invoca al constructor del objeto y la correspondiente llamada a delete invoca al destructor del objeto.
Hay otras diferencias:
new
es de tipo seguro, malloc
devuelve objetos de tipo void*
new
lanza una excepción en caso de error, malloc
devoluciones NULL
y establece errno
new
es un operador y se puede sobrecargar, malloc
es una función y no se puede sobrecargar
new[]
que asigna matrices, es más intuitivo y seguro para tipos que malloc
malloc
-las asignaciones derivadas se pueden redimensionar mediante realloc
, new
-las asignaciones derivadas no se pueden redimensionar
malloc
puede asignar un trozo de memoria de N bytes, new
se le debe pedir que asigne una matriz de, digamos, char
tipos
Mirando las diferencias, un resumen es malloc es C-esque, new es C++-esque. Use el que se sienta adecuado para su base de código.
Aunque es legal que new y malloc se implementen utilizando diferentes algoritmos de asignación de memoria, en la mayoría de los sistemas new se implementa internamente mediante malloc, lo que no genera diferencias a nivel del sistema.
Marius Bancila
Las únicas similitudes son que malloc
/new
ambos devuelven un puntero que se dirige a alguna memoria en el montón, y ambos garantizan que una vez que se haya devuelto dicho bloque de memoria, no se devolverá de nuevo a menos que lo libere o elimine primero. Es decir, ambos “asignan” memoria.
Sin embargo, new
/delete
realizar otro trabajo arbitrario además, a través de constructores, destructores y sobrecarga de operadores. malloc
/free
solo asignar y liberar memoria.
De hecho, new
es lo suficientemente personalizable que no necesariamente devuelve memoria del montón, o incluso asigna memoria en absoluto. Sin embargo, el valor predeterminado new
lo hace.
Vea también mi respuesta detallada aquí.
– Jonathan H.
24 de diciembre de 2014 a las 12:19