Ein interessanter Fall von Delete and Destructor (C ++)
Ich habe ein Stück Code, in dem ich den Destruktor mehrmals aufrufen und auf Member-Funktionen zugreifen kann, selbst wenn der Destruktor aufgerufen wurde und die Werte der Member-Variablen erhalten bleiben. Nachdem ich angerufen hatte, konnte ich immer noch auf Mitgliederfunktionen zugreifendelete
Die Mitgliedsvariablen wurden jedoch auf Null gesetzt (alle auf 0). Und ich kann nicht verdoppelndelete
. Bitte erläutern Sie dies.
#include <iostream>
using namespace std;
template <typename T>
void destroy(T* ptr)
{
ptr->~T();
}
class Testing
{
public:
Testing() : test(20)
{
}
~Testing()
{
printf("Testing is being killed!\n");
}
int getTest() const
{
return test;
}
private:
int test;
};
int main()
{
Testing *t = new Testing();
cout << "t->getTest() = " << t->getTest() << endl;
destroy(t);
cout << "t->getTest() = " << t->getTest() << endl;
t->~Testing();
cout << "t->getTest() = " << t->getTest() << endl;
delete t;
cout << "t->getTest() = " << t->getTest() << endl;
destroy(t);
cout << "t->getTest() = " << t->getTest() << endl;
t->~Testing();
cout << "t->getTest() = " << t->getTest() << endl;
//delete t; // <======== Don't do it! Double free/delete!
cout << "t->getTest() = " << t->getTest() << endl;
return 0;
}