Ü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 und operator delete. Sie werden implizit static. 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" zu T*. 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 verwechseln T::operator new(sizeof T) und new 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.

InformationsquelleAutor | 2011-03-23
Schreibe einen Kommentar