new - delete c++
¿Cuál es la diferencia entre new/delete y malloc/free? (15)
nuevo / borrar
- Asignar / liberar memoria
- Memoria asignada de ''Free Store''
- Devuelve un puntero completamente escrito.
- nuevo (versión estándar) nunca devuelve un valor NULL (se producirá un error)
- Se llama con Type-ID (el compilador calcula el tamaño)
- Tiene una versión explícita para manejar arrays.
- La reasignación (para obtener más espacio) no se maneja de forma intuitiva (debido al constructor de copia).
- Si se llama malloc / free se define la implementación.
- Puede agregar un nuevo asignador de memoria para tratar con poca memoria (set_new_handler)
- El operador new / delete puede ser anulado legalmente
- constructor / destructor utilizado para inicializar / destruir el objeto
malloc / libre
- Asignar / liberar memoria
- Memoria asignada desde ''Heap''
- Devuelve un vacío *
- Devuelve NULL en caso de fallo
- Debe especificar el tamaño requerido en bytes.
- La asignación de la matriz requiere el cálculo manual del espacio.
- Reasignación de una porción de memoria más grande (no hay que preocuparse por el constructor de copias)
- NO llamarán nuevo / borrar
- No hay forma de unir el código de usuario en la secuencia de asignación para ayudar con poca memoria.
- 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:
-
new
construye el objeto llamando al constructor de ese objeto -
new
no requiere encasillado de la memoria asignada. - 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 tipovoid*
new
lanza una excepción en caso de error,malloc
devuelveNULL
y establece errnonew
es un operador y se puede sobrecargar,malloc
es una función y no se puede sobrecargarnew[]
, que asigna matrices, es más intuitivo y de tipo seguro quemalloc
malloc
asignaciones derivadas se pueden cambiar de tamaño medianterealloc
, las asignacionesnew
derivadas no se pueden cambiar de tamañomalloc
puede asignar una porción de memoria de N bytes, se le debe solicitar anew
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 elnew
. -
new
y eldelete
pueden estar sobrecargados, peromalloc
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 demalloc
.
- 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''.