I have a piece of code where I can call the destructor multiple times and access member functions even the destructor was called with member variables’ values preserved. I was still able to access member functions after I called delete but the member variables were nullified (all to 0). And I can’t double delete. Please kindly explain this.
#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;
}
This is an exhibit of undefined behavior. Call a member function through a pointer that’s been deleted and anything goes – the compiler and runtime aren’t required to check for this error, but you certainly can’t count on this working.
This falls into a similar category as using memory that’s been freed – you might find your old data there (or you might not). You might cause the program to crash (or not). You might even be able to change the data without anything complaining.
But in any case, it’s a programming error.