c++ - Diferencia entre operador global nuevo y malloc.
calloc vs malloc (3)
Hay dos diferencias que puedo pensar:
La función que debe usar para desasignar la memoria, el
operator deletefrente afree().Un programa de C ++ puede proporcionar legalmente su propia versión de
::operator newy se garantiza que esa versión será llamada pornewexpresiones. No es posible anularmalloccon 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
- usted puede replace portátil
::operator new; -
mallocviene conrealloc, por lo quenewno tiene equivalente; -
newtiene el concepto denew_handler, para el cual no hay un equivalente demalloc.
(Reemplazar malloc abre una lata de gusanos . Se puede hacer, pero no de manera portátil, ya que requiere conocimiento del enlazador).