c++ c++11 memory-management malloc new-operator

c++ - Diferencia entre operador global nuevo y malloc.



calloc vs malloc (3)

Hay dos diferencias que puedo pensar:

  1. La función que debe usar para desasignar la memoria, el operator delete frente a free() .

  2. Un programa de C ++ puede proporcionar legalmente su propia versión de ::operator new y se garantiza que esa versión será llamada por new expresiones. No es posible anular malloc con su propia versión.

C ++ tiene varias funciones para adquirir almacenamiento dinámico, la mayoría de las cuales difieren de alguna manera fundamental. Varios más son generalmente agregados por el sistema operativo.

Dos de estos son de especial interés debido a su portabilidad y similitud: malloc y ::operator new .

¿Hay diferencias (entre el estándar y la implementación) entre el void* operator new(size_t, ::std::nothrow&) global void* operator new(size_t, ::std::nothrow&) y void* malloc(size_t) ?

Ya que parece haber cierta confusión sobre lo que estoy hablando, considere las siguientes dos llamadas:

void* p = ::std::malloc(10); void* q = ::operator new(10, ::std::nothrow);

La diferencia obvia y trivial es cómo desasignar la memoria:

::std::free(p); ::operator delete(q);

Nota: esta pregunta no es un duplicado de, por ejemplo, ¿cuál es la diferencia entre new / delete y malloc / free? ya que habla sobre el uso del operator new global que en realidad no realiza ninguna llamada ctor.


La diferencia macroscópica que puedo ver sin más investigación es que la variante de lanzamiento del operador global ::new lanza std::bad_alloc si la asignación no se puede hacer, mientras que malloc devuelve NULL . Pero sí creo que la mayoría de las diferencias que se enumeran here aplican al operador global ::new , incluso si el tema es new .


Las principales diferencias, aparte de la sintaxis y free vs. delete , son

  1. usted puede replace portátil ::operator new ;
  2. malloc viene con realloc , por lo que new no tiene equivalente;
  3. new tiene el concepto de new_handler , para el cual no hay un equivalente de malloc .

(Reemplazar malloc abre una lata de gusanos . Se puede hacer, pero no de manera portátil, ya que requiere conocimiento del enlazador).