Ich habe Klasse Item
die ihre eigenen Betreiber neue und Betreiber löschen wie folgt definiert:Wird der Destruktor implizit in einer überladenen Operator-Löschfunktion aufgerufen?
class Item
{
public:
Item(const std::string &s):msg(s)
{
std::cout<<"Ctor: "<<msg<<std::endl;
}
static void* operator new(size_t size, int ID, const std::string &extra)
{
std::cout<<"My Operator New. ID/extra: "<<ID<<"/"<<extra<<std::endl;
return ::operator new(size);
}
static void operator delete(void* p)
{
std::cout<<"My Operator Delete"<<std::endl;
return;
}
~Item()
{
std::cout<<"Destructor: "<<msg<<std::endl;
}
void Print()
{
std::cout<<"Item::msg: "<<msg<<std::endl;
}
private:
std::string msg;
};
ich ein Objekt dieses Typs erstellen, indem Sie eine Platzierung neuer und anschließend löschen, wie folgt:
int main()
{
Item *pI=new(1,"haha")Item("AC Milan");
std::cout<<"before delete"<<std::endl;
delete pI;
std::cout<<"after delete"<<std::endl;
return 0;
}
die Ausgabe lautet:
My Operator New. ID/extra: 1/haha
Ctor: AC Milan
before delete
Destructor: AC Milan
My Operator Delete
after delete
Wie Sie sehen können, delete pI
meine eigene Löschfunktion aufruft, in dem nothi ng wird ausgeführt, außer dass ein Protokoll ausgegeben wird. Von der Ausgabe wird jedoch der Destruktor Item
in delete pI
aufgerufen, der in meiner eigenen Löschfunktion nicht aufgerufen wird.
In diesem Fall würde Destruktor implizit in einer überladenen Löschfunktion aufgerufen werden?
Ich benutze g ++ 4.9.3 –
Es ist das gleiche für Ihre "neue" und Ihre "delete" -Operatoren. Sie rufen den Konstruktor in Ihrem überladenen 'new'-Operator auch nicht auf und er wird immer noch aufgerufen. Die Konstruktoren und Destruktoren werden immer aufgerufen, wenn die Operatoren 'new' und' delete' verwendet werden. –
Speicherzuordnung und Objekterstellung/-zerstörung sind zwei verschiedene Dinge. Das Überladen der Zuordnungsfunktionen wirkt sich nur auf erstere aus; Letzteres wird vollständig von den Kernsprachenregeln gesteuert. –