Überladen von operator new für die Klasse
Wenn wir überlasten new-operator einer Klasse deklarieren wir die Funktion als member-Funktion.
Für zB:
class OpNew {
public:
OpNew() { cout << "OpNew::OpNew()" << endl;}
void* operator new(size_t sz) {
cout << "OpNew::new: "
<< sz << " bytes" << endl;
return ::new char[sz];
}
};
Wie funktioniert die Anweisung OpNew *obj = new OpNew
Arbeit unter der Haube ? als überladene neue Mitglied OpNew Klasse nicht statisch ist. Also, wie sieht compiler dies sicherzustellen Aufruf new
member-Funktion gelingt?
- Es sollte statisch sein.
- Ich hoffe, dass Sie überlastet
operator delete
wie gut, ansonsten hast du Undefiniertes Verhalten. - Natürlich habe ich, das war nur ein Ausschnitt 🙂
- N Fetissov Was sollte statisch sein? operator new ist immer statisch; Sie nicht haben, um es erklären, statische (und ich bin nicht einmal sicher, ob es legal ist, dies zu tun).
- ja,
operator new
undoperator delete
. Sie werden implizitstatic
. Es ist legal zu erklären, dass explizit. Das sollte gefordert wurden von der get-go zu vermeiden, genau diese weichen von Verwirrung. - Überladene operator new gibt void*. Wie kommt es, dass in der Anweisung
OpNew *obj = new OpNew
wir bekamen Konvertierung void* -> OpNew*? Solche coversions kann nicht getan werden implizit in C++, können Sie? - Die
void*
verbraucht wird von C++ selbst, es ist nicht "umgewandelt" zuT*
. Ein Objekt wird erstellt, innen, dass der Speicher (erfordert einen Konstruktor Aufruf), und einen Zeiger auf das neue Objekt an das Programm zurückgegeben wird. Nicht zu verwechselnT::operator new(sizeof T)
undnew T
-- das erste ist nur ein sehr kleiner Teil dessen, was die zweite bringt. - Mehr Effektiv C++ ist die Quelle für den strikten Rat: wenn Sie schreiben, ein Platzierung version der operator new, sicher sein, zu schreiben, das entsprechende Platzierung version der operator delete (Zitat aus effective C++, meine Betonung). Scheint, dass nur eine überlastung der nicht-Platzierung version des neuen Betreibers ist es nicht erforderlich, um eine überlastung auch löschen. Die machen Sinn, wenn Sie gehen über den genannten Gründen in Ziffer 52.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ein
operator new()
oderoperator new[]()
Klasse ist immer ein statisches Mitglied einer Klasse, auch wenn es nicht deklariert mit dem Schlüsselwort static.Was der C++ standard sagt (Entwurf n3242), die in Abschnitt
[class.free]
: