2014-07-01 7 views
7

Siehe verknüpfte Frage.Warum erfordert das Ersetzen von malloc() die Kenntnis des Linkers, aber :: operator new() nicht?

Difference between global operator new and malloc

Die akzeptierte Antwort Staaten,

„Ersetzen malloc eine Dose Würmer eröffnet. Es kann getan werden, aber nicht portabel, weil es Wissen des Linkers erfordert.“

Warum erfordert das Ersetzen von malloc Wissen über den Linker und warum ersetzt :: operator new() nicht?

+0

Derselbe Grund, den Sie deklarieren können, wenn Sie nur einen Zeiger haben, aber ein vollständiges Einschließen benötigen, wenn Sie eine Instanz eines Objekts haben. http://stackoverflow.com/questions/553682/when-cani-i-use-a-forward-declaration?rq=1 – CoryKramer

+0

Die Aussage von der verknüpften Antwort sagt '3. new hat das Konzept eines new_handler, für das es kein malloc-Äquivalent gibt. " IMHO, das ist nicht 100% wahr. In der Undering-C-Bibliothek sind normalerweise mehrere schwache Symbole deklariert, die mit eigenen Implementierungen überschrieben werden können (siehe z. B. ['_sbrk'] (http://en.wikipedia.org/wiki/Sbrk)). Deklarierte schwache Symbole beinhalten nicht notwendigerweise _Knowdele des Linkers_. –

Antwort

7

Standard C++ enthält Vorkehrungen für das Überschreiben ::operator new. Während die Implementierung sicherlich chaotisch und linker-bezogen ist, kann ein C++ - Programm einfach einen anderen ::operator new definieren und es funktioniert. Der C++ - Standard besagt explizit: Programme können diese durch eigene Definitionen (etc. etc. verschiedene Einschränkungen und Details) ersetzen.

malloc auf der anderen Seite ist eine gewöhnliche Funktion in einer gewöhnlichen Bibliothek definiert, und C (und C++, für diese Angelegenheit) hat keine Möglichkeiten, eine Funktion wie diese zu ersetzen. Sie können praktisch jeden Linker unter der Sonne dazu verleiten, einen Link zu Ihrem Code zu erstellen und Referenzen auf malloc auf Code aus einer anderen Bibliothek/Objektdatei aufzulösen. Aber Sie können nicht einfach eine andere malloc Funktionen definieren, da dies die Ein-Definition-Regel verletzt: Sie haben am Ende mit zwei Funktionen namens "malloc" im Programm, die beide durch den Standard verboten ist (für Nicht-static, nicht anonym - namespace, nicht inline, ... Funktionen) und ein ernsthaftes Problem für Linker (höchstwahrscheinlich wird ein Fehler oder eine der beiden Definitionen verworfen).

Verwandte Themen