c++ dynamic - ¿Cuál es la diferencia entre new / delete y malloc / free?




memory (13)

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

Relacionados (¿duplicar?): ¿En qué casos uso malloc vs new?


Answers

1.new 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 ha pegado directamente el nuevo código de ensamblaje.

4.podemos cambiar el significado nuevo / borrado en el programa con la ayuda del overlading del operador.


además,

Las nuevas y eliminaciones globales se pueden anular, malloc / free no se puede anular.

aún más nuevo y eliminar puede ser anulado por tipo.


Llamadas new al ctor del objeto, delete llamar al dtor.

malloc & free simplemente asigna y libera memoria en bruto.


nuevo / borrar

  • Asignar / liberar memoria
    1. Memoria asignada de 'Free Store'
    2. Devuelve un puntero completamente escrito.
    3. nuevo (versión estándar) nunca devuelve un valor NULL (se producirá un error)
    4. Se llama con Type-ID (el compilador calcula el tamaño)
    5. Tiene una versión explícita para manejar arrays.
    6. La reasignación (para obtener más espacio) no se maneja de forma intuitiva (debido al constructor de copia).
    7. Si se llama malloc / free se define la implementación.
    8. Puede agregar un nuevo asignador de memoria para tratar 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 / libre

  • Asignar / liberar memoria
    1. Memoria asignada desde 'Heap'
    2. Devuelve un vacío *
    3. Devuelve NULL en caso de fallo
    4. Debe especificar el tamaño requerido en bytes.
    5. La asignación de la matriz requiere el cálculo manual del espacio.
    6. Reasignación de una porción de memoria más grande (no hay que preocuparse por el constructor de copias)
    7. NO llamarán nuevo / borrar
    8. No hay forma de unir el código de usuario en la secuencia de asignación para ayudar con poca memoria.
    9. malloc / free NO puede ser anulado 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 nuevo 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 la implementación, que es otra razón por la que malloc y new no se pueden mezclar.


Hay algunas cosas que hace new que malloc no hace:

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

Por lo tanto, si usa malloc , entonces debe hacer lo anterior explícitamente, lo que no siempre es práctico. Además, lo new puede estar sobrecargado, pero malloc no puede estarlo.

En una palabra, si usa C ++, intente usar lo más posible.


new y delete son primitivas de C ++ que declaran una nueva instancia de una clase o la eliminan (invocando así al destructor de la clase para la instancia).

malloc y free son funciones C y asignan y liberan bloques de memoria (en tamaño).

Ambos usan el montón para hacer la asignación. malloc obstante, malloc y free son más "de bajo nivel", ya que solo reservan una porción 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).


new y delete son operadores en c ++; que puede ser sobrecargado también. malloc y free son función en c;

malloc devuelve null ptr cuando falla, mientras que la nueva excepción de lanzamientos.

La dirección devuelta por malloc debe ser convertida de nuevo por tipo, ya que devuelve el (void *) malloc (tamaño) Nuevo devuelve el puntero escrito.


Este código para el uso de eliminar palabra clave o función gratuita. Pero cuando se crea un objeto de puntero con 'malloc' o 'nuevo' y se desasigna la memoria de objetos con eliminar, incluso ese puntero de objeto se puede llamar función en la clase. Después de ese uso, en lugar de eliminar, entonces también funciona después de la declaración libre, pero cuando se usan ambos, entonces solo el 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

En C ++ new / delete llame al Constructor / Destructor como corresponda.

malloc / free simplemente asigna memoria del montón. new / delete asignar memoria también.


La diferencia más relevante es que el new operador asigna memoria, luego llama al constructor, y delete llamadas al destructor y luego desasigna la memoria.


  • Para usar malloc() , debemos incluir <stdlib.h> o <alloc.h> en el programa que no es necesario para el new .
  • new y el delete pueden estar sobrecargados, pero malloc no puede.
  • Usando la new ubicación, podemos pasar la dirección a la que queremos asignar memoria, pero esto no es posible en el caso de malloc .

Las únicas similitudes son que malloc / new devuelve un puntero que direcciona parte de la memoria del montón, y ambos garantizan que una vez que se haya devuelto dicho bloque de memoria, no se devolverá de nuevo a menos que primero lo libere / elimine. Es decir, ambos "asignan" memoria.

Sin embargo, new / delete realiza otro trabajo arbitrario además, a través de constructores, destructores y sobrecarga de operadores. malloc / free solo asigna y libera memoria.

De hecho, lo new es lo suficientemente personalizable como para que no necesariamente devuelva la memoria del montón, ni siquiera asigne memoria. Sin embargo, el new valor predeterminado lo hace.


  • #include <> es para archivos de encabezado predefinidos

Si el archivo de encabezado está predefinido, simplemente escribiría el nombre del archivo de encabezado entre paréntesis angulares, y se vería así (asumiendo que tenemos un iostream de nombre de archivo de encabezado predefinido):

#include <iostream>
  • #include " " es para los archivos de encabezado que define el programador

Si usted (el programador) escribió su propio archivo de encabezado, entonces escribiría el nombre del archivo de encabezado entre comillas. Entonces, supongamos que escribiste un archivo de encabezado llamado myfile.h , entonces este es un ejemplo de cómo myfile.h la directiva de inclusión para incluir ese archivo:

#include "myfile.h"




c++ memory-management