¿Cuál es la diferencia entre new/ deletey 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.newoperador 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
newoperador asigna memoria y luego llama al constructor, ydeletellama al destructor y luego desasigna la memoria.fuente
newllama al ctor del objeto,deletellama al dtor.malloc&freesimplemente asignar y liberar memoria en bruto.fuente
new/deletees C ++,malloc/freeproviene del buen viejo C.En C ++,
newllama a un constructor de objetos ydeletellama al destructor.mallocyfree, 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/deletellame al Constructor / Destructor en consecuencia.malloc/freesimplemente asigne memoria del montón.new/deleteasignar memoria también.fuente
Las únicas similitudes son que
malloc/newambos 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/deleterealizar otro trabajo arbitrario además, a través de constructores, destructores y la sobrecarga de operadores.malloc/freesolo asigna y libera memoria.De hecho,
newes suficientemente personalizable que no necesariamente devuelve memoria del montón, ni siquiera asigna memoria en absoluto. Sin embargo, el valor predeterminadonewsí.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:
newes seguro para los tipos,mallocdevuelve objetos de tipovoid*newlanza una excepción por error,mallocregresaNULLy establece errnonewes un operador y se puede sobrecargar,malloces una función y no se puede sobrecargarnew[], que asigna matrices, es más intuitivo y de tipo seguro quemallocmalloclas asignaciones derivadas pueden redimensionarse a través derealloc, lasnewasignaciones derivadas no pueden redimensionarsemallocpuede asignar un fragmento de memoria de N bytes,newse le debe pedir que asigne una matriz de, por ejemplo,chartiposMirando 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
newhace quemallocno:newconstruye el objeto llamando al constructor de ese objetonewno 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,newse puede sobrecargar peromallocno se puede.En una palabra, si usa C ++, intente usar
newtanto 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
newydeleteson primitivas de C ++ que declaran una nueva instancia de una clase o la eliminan (invocando al destructor de la clase para la instancia).mallocyfreeson funciones C y asignan y liberan bloques de memoria (en tamaño).Ambos usan el montón para hacer la asignación.
mallocyfree, 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.newydeletese puede sobrecargar peromallocno se puede.new, podemos pasar la dirección donde queremos asignar memoria, pero esto no es posible en caso demalloc.fuente
alloc.hNo 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