¿Cuál es la diferencia entre new/ deletey malloc/ free?
Relacionado (¿duplicado?): ¿En qué casos uso malloc vs nuevo?
¿Cuál es la diferencia entre new/ deletey 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.
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".
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.
newllama al ctor del objeto, deletellama al dtor.
malloc& freesimplemente asignar y liberar memoria en bruto.
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.
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í.
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.
Hay algunas cosas que newhace que mallocno:
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, newse puede sobrecargar pero mallocno se puede.
En una palabra, si usa C ++, intente usar newtanto como sea posible.
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).
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.newy deletese puede sobrecargar pero mallocno se puede.new, podemos pasar la dirección donde queremos asignar memoria, pero esto no es posible en caso de malloc.alloc.hNo 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.