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