2014-07-01 12 views
7

Vedere la domanda collegata.Perché la sostituzione di malloc() richiede la conoscenza del linker ma: operator new() no?

Difference between global operator new and malloc

Gli stati accettati risposta,

"Sostituzione malloc apre un vaso di Pandora. Si può fare, ma non portabile, perché richiede la conoscenza del linker".

Perché la sostituzione di malloc richiede la conoscenza del linker e perché sostituisce :: operator new() no?

+0

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

+0

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_. –

risposta

7

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 libcsans 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).

Problemi correlati