¿Cuál es la diferencia entre new / delete y malloc / free?


Respuestas:


466

nuevo / eliminar

  • Asignar / liberar memoria
    1. Memoria asignada desde 'Free Store'
    2. Devuelve un puntero completamente tipado.
    3. nuevo (versión estándar) nunca devuelve un NULL (arrojará en caso de error)
    4. Se llaman con Type-ID (el compilador calcula el tamaño)
    5. Tiene una versión explícita para manejar matrices.
    6. La reasignación (para obtener más espacio) no se maneja intuitivamente (debido al constructor de copia).
    7. Si llaman malloc / free está definida la implementación.
    8. Puede agregar un nuevo asignador de memoria para lidiar con poca memoria (set_new_handler)
    9. El operador new / delete puede ser anulado legalmente
    10. constructor / destructor utilizado para inicializar / destruir el objeto

malloc / gratis

  • Asigna / libera memoria
    1. Memoria asignada desde 'Heap'
    2. Devuelve un vacío *
    3. Devuelve NULL en caso de falla
    4. Debe especificar el tamaño requerido en bytes.
    5. La asignación de la matriz requiere el cálculo manual del espacio.
    6. La reasignación de una gran cantidad de memoria es simple (no hay que preocuparse por el constructor de copias)
    7. NO lo harán llamar a new / delete
    8. No hay forma de empalmar el código de usuario en la secuencia de asignación para ayudar con poca memoria.
    9. malloc / free NO se puede anular legalmente

Tabla de comparación de las características:

 Feature                  | new/delete                     | malloc/free                   
--------------------------+--------------------------------+-------------------------------
 Memory allocated from    | 'Free Store'                   | 'Heap'                        
 Returns                  | Fully typed pointer            | void*                         
 On failure               | Throws (never returns NULL)    | Returns NULL                  
 Required size            | Calculated by compiler         | Must be specified in bytes    
 Handling arrays          | Has an explicit version        | Requires manual calculations  
 Reallocating             | Not handled intuitively        | Simple (no copy constructor)  
 Call of reverse          | Implementation defined         | No                            
 Low memory cases         | Can add a new memory allocator | Not handled by user code      
 Overridable              | Yes                            | No                            
 Use of (con-)/destructor | Yes                            | No                            

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.


12
¿Alguien puede editar para elaborar sobre la "Tienda gratuita" en lugar del montón? Un montón de procesos es un concepto bien conocido de nivel de sistema operativo independiente del lenguaje (?); ¿De dónde viene la "Tienda gratuita"?
einpoklum

1
@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 "montón de procesos". C ++ se define deliberadamente para ser neutral para la plataforma / sistema operativo / compilador. Por lo tanto, el uso de un concepto de sistema operativo específico como "montón de procesos" socavaría la flexibilidad del estándar.
Martin York

44
@winterlight: Eso solía ser cierto pero ya no. Ver: linux.die.net/man/3/free If ptr is NULL, no operation is performed.
Martin York

2
@LokiAstari Parece que 'montón', 'tienda libre' y 'memoria / almacenamiento dinámico' son sinónimos: en Bjarne Stroustrup's A Tour of C ++ , dice "El 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".
Max Heiber

2
@mheiber: Significa que pueden ser lo mismo. Y varias implementaciones implementan nuevas llamando a malloc (tenga en cuenta que al revés no está explícitamente permitido). Pero varias implementaciones mantienen esas áreas de memoria completamente separadas. La razón también los mantuvo separados es que esto permite que el código de administración de memoria de C ++ se optimice de una manera diferente que la administración de memoria de C ++. El punto es: podrían ser lo mismo, pero no puedes asumir que lo son.
Martin York

81

La diferencia más relevante es que el newoperador asigna memoria y luego llama al constructor, y deletellama al destructor y luego desasigna la memoria.


22
Estrictamente hablando, el nuevo operador simplemente asigna la memoria. Es la nueva expresión la que llama al nuevo operador, luego ejecuta el constructor en la memoria asignada.
Don Wakefield

Otra diferencia es dónde se asigna la memoria. Recientemente 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. (Baste decir, sin embargo, que otra área probablemente pueda considerarse como otro montón).
RobH

2
@mgb: Sí, tiene razón en que los objetos se asignan en el "montón de aplicaciones" o en la pila. Pero @RobH se refiere a lo que el estándar llama diferentes partes del "montón de aplicaciones". Existe el "Heap", que es donde malloc asigna memoria y "Free Store" de donde nuevo asigna memoria. Aunque en algunas implementaciones estas áreas se superponen (esto es un detalle de implementación).
Martin York

1
Su afirmación es 100% correcta, pero simplemente no responde a la pregunta formulada, vea la respuesta a continuación, hay una razón por la que vota más que la suya.
Murali

1
Todo lo que intentaba 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 positivos, espero que entiendan mi punto. De todos modos, si SO me permitiera retirar mi voto negativo, lo haría de todo corazón.
Murali

30

newllama al ctor del objeto, deletellama al dtor.

malloc& freesimplemente asignar y liberar memoria en bruto.


¿Qué quieres decir con memoria cruda?
Destructor

3
No se le ha hecho nada a la memoria sin procesar. Aún 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

14

new/ deletees C ++, malloc/ freeproviene del buen viejo C.

En C ++, newllama a un constructor de objetos y deletellama al destructor.

mallocy free, viniendo de las edades oscuras antes de OO, solo asigna y libera la memoria, sin ejecutar ningún código del objeto.


9
"Procedente de las edades oscuras antes de OO" parece que estás implicando que new / delete son mejores que malloc / free cuando en realidad, ni es mejor ni peor, solo tienen diferentes usos. Tenga en cuenta que no soy el único que lo votó negativamente, solo estoy adivinando.
Graeme Perrow

13

En C ++ new/ deletellame al Constructor / Destructor en consecuencia.

malloc/ freesimplemente asigne memoria del montón. new/ deleteasignar memoria también.


10

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 predeterminado newsí.


7

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, mallocregresa NULLy establece errno

  • newes un operador y se puede sobrecargar, malloces una función y no se puede sobrecargar

  • new[], que asigna matrices, es más intuitivo y de tipo seguro que malloc

  • malloclas asignaciones derivadas pueden redimensionarse a través de realloc, las newasignaciones derivadas no pueden redimensionarse

  • malloc puede asignar un fragmento de memoria de N bytes, new se le debe pedir que asigne una matriz de, por ejemplo, chartipos

Mirando 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.


5

Hay algunas cosas que newhace que mallocno:

  1. new construye el objeto llamando al constructor de ese objeto
  2. new no requiere conversión de tipo de memoria asignada.
  3. No requiere que se asigne una cantidad de memoria, sino que requiere la construcción de varios objetos.

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 pero mallocno se puede.

En una palabra, si usa C ++, intente usar newtanto como sea posible.


4

además,

el nuevo global y el borrado pueden anularse, malloc / free no.

Se pueden anular más nuevos y eliminar por tipo.


3

newy deleteson primitivas de C ++ que declaran una nueva instancia de una clase o la eliminan (invocando al destructor de la clase para la instancia).

mallocy freeson funciones C y asignan y liberan bloques de memoria (en tamaño).

Ambos usan el montón para hacer la asignación. mallocy free, 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).


1
nuevo en C ++ no declara una instancia de una clase. (Generalmente) asigna uno del montón, y no declara nada. Puede declarar una instancia con solo declararla, en cuyo caso estará en la pila o en forma global, dependiendo de la duración del almacenamiento de la declaración.
Steve Jessop

Bueno, asigna el espacio de memoria para la clase, pero no puede "declarar" una clase en la pila, no en el sentido real de almacenar la clase en la pila. La declaración involucra solo el puntero a la clase que siempre se asigna en la pila, la memoria real que contiene la clase está en el montón.
Jorge Córdoba

Sí tu puedes. Según las etiquetas de preguntas, esto es C ++, por lo que los objetos pueden ir a la pila. Y nuevo no es una declaración, es una expresión. Declarar algo y asignarlo son cosas separadas.
Steve Jessop

2

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.


2
  • new es un operador, mientras que malloc () es una función.
  • new devuelve el tipo de datos exacto, mientras que malloc () devuelve void * (puntero del tipo void).
  • malloc (), la memoria no se inicializa y el valor predeterminado es basura, mientras que en caso de nuevo, la memoria se inicializa con el valor predeterminado, como con 'cero (0)' en caso de int.
  • delete y free () ambos se pueden usar para punteros 'NULL'.

0
  • Para usar el malloc(), necesitamos incluir <stdlib.h> o <alloc.h>en el programa que no se requiere new.
  • newy deletese puede sobrecargar pero mallocno se puede.
  • Usando la ubicación new, podemos pasar la dirección donde queremos asignar memoria, pero esto no es posible en caso de malloc.

1
alloc.hNo es un encabezado estándar. <new>se requiere para usar la colocación nueva.
MM

0

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:

#include<iostream>


using namespace std;

class ABC{
public: ABC(){
    cout<<"Hello"<<endl;
  }

  void disp(){
    cout<<"Hi\n";
  }

};

int main(){

ABC* b=(ABC*)malloc(sizeof(ABC));
int* q = new int[20];
ABC *a=new ABC();
b->disp();

cout<<b<<endl;
free(b);
delete b;
//a=NULL;
b->disp();
ABC();
cout<<b;
return 0;
}

salida:

Hello
Hi
0x2abfef37cc20

-3

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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.