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 delete
frente afree()
.Un programa de C ++ puede proporcionar legalmente su propia versión de
::operator new
y se garantiza que esa versión será llamada pornew
expresiones. No es posible anularmalloc
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
- usted puede replace portátil
::operator new
; -
malloc
viene conrealloc
, por lo quenew
no tiene equivalente; -
new
tiene 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).