Il C++ standard consente di ignorare lo ::operator new
. Mentre l'implementazione è sicuramente disordinata e correlata al linker, un programma C++ può semplicemente definire un diverso ::operator new
e funziona. Lo standard C++ dice esplicitamente: i programmi possono sostituirli con le loro definizioni (ecc. Ecc. Varie restrizioni e dettagli).
malloc
d'altra parte è una funzione ordinaria definita in una libreria ordinaria, e C (e C++, per quella materia) non ha possibilità di sostituire una funzione del genere. È possibile convincere praticamente ogni linker sotto il sole per collegare i vostri libc
sans malloc
e risolvere i riferimenti alle malloc
a qualche codice da un altro file di libreria/oggetto. Ma non puoi semplicemente definire una diversa funzione malloc
dal momento che viola la regola a una definizione: ti ritroverai con due funzioni chiamate "malloc" nel programma, entrambe vietate dallo standard (per non- static
, non anonimo - namespace
, non-inline
, ... funzioni) e un problema serio per i linker (molto probabilmente, un errore o una delle due definizioni viene eliminato).
Lo stesso motivo per cui è possibile inoltrare la dichiarazione se si dispone di un puntatore, ma è necessario un completo se si dispone di un'istanza di un oggetto. http://stackoverflow.com/questions/553682/when-can-i-use-a-forward-declaration?rq=1 – CoryKramer
L'istruzione dalla risposta collegata dice '3. nuovo ha il concetto di un new_handler, per il quale non esiste un equivalente malloc. IMHO che non è vero al 100%. Di solito ci sono diversi simboli deboli dichiarati nella libreria underyling c, che può essere _overridden_ con le proprie implementazioni (si veda ad esempio ['_sbrk'] (http://en.wikipedia.org/wiki/Sbrk)). I simboli deboli dichiarati non implicano necessariamente _Knowdlege del linker_. –