¿Cuál es la diferencia entre "nuevo" y "malloc" y "calloc" en C++?
heap vs stack diferencia (7)
¿Cuál es la diferencia entre "nuevo" y "malloc" y "calloc" y otros en la familia?
(Cuándo) ¿Necesito algo más que "nuevo"?
¿Uno de ellos se implementa utilizando cualquier otro?
Cuando crea un objeto nuevo , el espacio para el objeto no solo se asigna sino que se llama al constructor del objeto. Pero esta es la forma en C ++ que se hace, malloc es la forma antigua en C de asignar memoria. calloc es lo mismo que malloc , excepto que borra la memoria de todos los bits cero.
La principal diferencia entre new y malloc que puedo recordar es que no se puede reasignar la memoria asignada por new usando realloc. Entonces, si desea aumentar / disminuir el tamaño del bloque de memoria, debe asignar un nuevo bloque y copiar todo.
Calloc le permite inicializar el bloque de memoria que asigna mientras que malloc no lo hace.
No necesitas nada más que nuevo. Es un reemplazo completo para malloc en C ++.
En cuanto a la diferencia: Malloc solo asigna memoria. Nueva memoria asignada y llama a los constructores. Del mismo modo, simplemente libera la memoria. Delete libera la memoria y llama al destructor.
Una palabra de advertencia: No mezcles los dos idiomas. Los resultados no están definidos.
Usar nuevo significa que los constructores serán llamados en la memoria recién asignada. Si la cosa asignada no tiene constructores, la nueva es funcionalmente idéntica a malloc. y normalmente debería usarse en relación con esto.
nuevo puede o no implementarse en términos de malloc: el estándar de C ++ no requiere ninguno de los enfoques.
new
y delete
son características específicas de C ++. No existían en C. malloc
es la forma de la vieja escuela C de hacer cosas. La mayoría de las veces, no necesitará usarlo en C ++.
-
malloc
asigna memoria no inicializada. La memoria asignada tiene que ser liberadafree
. -
calloc
es comomalloc
pero inicializa la memoria asignada con una constante (0). Necesita ser liberadofree
. -
new
inicializa la memoria asignada llamando al constructor (si es un objeto). La memoria asignada connew
debe liberarse condelete
(que a su vez llama al destructor). No necesita que especifique manualmente el tamaño que necesita y lo transfiera al tipo apropiado. Por lo tanto, es más moderno y menos propenso a errores.
nuevo / eliminar + nuevo [] / eliminar []:
- new / delete es la forma C ++ de asignar memoria y desasignar la memoria del montón.
- new [] y delete [] es la forma c ++ de asignar matrices de memoria contigua.
- Debe usarse porque es más seguro que malloc
- Debería usarse porque llama al constructor / destructor
- No se puede usar de una manera realloc, pero puede usar la ubicación nueva para reutilizar el mismo búfer de datos
- Los datos no se pueden asignar con nuevos y liberados con free, ni delete []
malloc / free + family:
- malloc / free / family es la forma C de asignar y liberar memoria del montón.
- calloc es lo mismo que malloc pero también inicializa la memoria
- Debe usarse si es necesario reasignar la memoria
- Los datos no pueden ser asignados con malloc y liberados con delete ni delete []
También vea mi respuesta relacionada aquí
- nuevas asignaciones y llamadas a ctor (la orden no está especificada), borre el dtor y libera la memoria asignada por una llamada a un nuevo
- malloc solo asigna algo de memoria, elimina la memoria asignada por malloc
- nuevo puede implementarse utilizando malloc (no requerido por el estándar)
- calloc hace lo mismo que malloc y también pone a cero la memoria recién asignada
Como han señalado otras publicaciones: malloc / free es parte de C ++ para ser compatible con C.
Ver también: Stroustrup: nuevo vs malloc