¿Cuál es la diferencia entre “nuevo” y “malloc” y “calloc” en C ++?

¿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?

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 liberada free .
  • calloc es como malloc pero inicializa la memoria asignada con una constante (0). Necesita ser liberado free .
  • new inicializa la memoria asignada llamando al constructor (si es un objeto). La memoria asignada con new debe liberarse con delete (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

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.

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.

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 boost / 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.

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.