new delete c++ memory-management

new - delete c++



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

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.

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

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


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.


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

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


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


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.


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.


La principal diferencia entre new y malloc es que new invoca al constructor del objeto y la llamada correspondiente 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 devuelve 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 de tipo seguro que malloc

  • malloc asignaciones derivadas se pueden cambiar de tamaño mediante realloc , las asignaciones new derivadas no se pueden cambiar de tamaño

  • malloc puede asignar una porción de memoria de N bytes, se le debe solicitar a new que asigne una matriz de, por ejemplo, tipos de caracteres

Al observar las diferencias, un resumen es malloc es C-esque, lo nuevo es C ++ - esque. Use el que se sienta bien para su código base.

Aunque es legal que se implementen nuevos y malloc utilizando diferentes algoritmos de asignación de memoria, en la mayoría de los sistemas, los nuevos se implementan internamente utilizando malloc, sin que exista una diferencia en el nivel del sistema.


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.


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

malloc & free simplemente asigna y libera memoria en bruto.


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.


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.


new / delete is C ++, malloc / free viene de old old C.

En C ++, las new llamadas a un constructor de objetos y delete llamadas al destructor.

malloc y free , procedentes de las edades oscuras antes de OO, solo asignan y liberan la memoria, sin ejecutar ningún código del objeto.


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


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

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