¿Cuál es la diferencia entre new
/ delete
y malloc
/ free
?
Relacionado (¿duplicado?): ¿En qué casos uso malloc vs nuevo?
¿Cuál es la diferencia entre new
/ delete
y malloc
/ free
?
Relacionado (¿duplicado?): ¿En qué casos uso malloc vs nuevo?
Respuestas:
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.
If ptr is NULL, no operation is performed.
new
operador 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 new
operador asigna memoria y luego llama al constructor, y delete
llama al destructor y luego desasigna la memoria.
new
llama al ctor del objeto, delete
llama al dtor.
malloc
& free
simplemente asignar y liberar memoria en bruto.
new
/ delete
es C ++, malloc
/ free
proviene del buen viejo C.
En C ++, new
llama a un constructor de objetos y delete
llama al destructor.
malloc
y free
, viniendo de las edades oscuras antes de OO, solo asigna y libera la memoria, sin ejecutar ningún código del objeto.
Las únicas similitudes son que malloc
/ new
ambos 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
/ delete
realizar otro trabajo arbitrario además, a través de constructores, destructores y la sobrecarga de operadores. malloc
/ free
solo asigna y libera memoria.
De hecho, new
es suficientemente personalizable que no necesariamente devuelve memoria del montón, ni siquiera asigna memoria en absoluto. Sin embargo, el valor predeterminado new
sí.
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:
new
es seguro para los tipos, malloc
devuelve objetos de tipovoid*
new
lanza una excepción por error, malloc
regresa 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
las asignaciones derivadas pueden redimensionarse a través de realloc
, las new
asignaciones 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, char
tipos
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.
Hay algunas cosas que new
hace que malloc
no:
new
construye el objeto llamando al constructor de ese objetonew
no 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, new
se puede sobrecargar pero malloc
no se puede.
En una palabra, si usa C ++, intente usar new
tanto como sea posible.
new
y delete
son primitivas de C ++ que declaran una nueva instancia de una clase o la eliminan (invocando 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
y 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).
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.
malloc()
, necesitamos incluir <stdlib.h>
o
<alloc.h>
en el programa que no se requiere new
.new
y delete
se puede sobrecargar pero malloc
no se puede.new
, podemos pasar la dirección donde queremos asignar memoria, pero esto no es posible en caso de malloc
.alloc.h
No 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:
#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
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.