C++中的析构函数直接调用
Destructor direct call in C++
因此有下面的代码。
class A
{
int x;
public:
A() {x = 3;}
};
int main()
{
void* mem = operator new(sizeof(A));
A* obj = static_cast<A*>(new(mem)(A));
std::cout << obj->x << std::endl;
obj->A::~A();
std::cout << obj->x << std::endl;
}
我的第一个问题是:为什么我可以直接调用A的析构函数;
我的第二个问题是:为什么输出是:
3
3
调用析构函数后对象obj没有被删除?第二个3困扰我。
Why can I call the destructor?
因为是public个成员函数,可以调用public个成员函数
Why is the object not deleted?
在你的具体情况下,它仍然存在,因为 A
有一个微不足道的析构函数。
如果它有一个不平凡的,它会被删除,因为你不能再使用它了。不管怎样,你有 undefined behavior。
有关该内容的更详细讨论,请阅读 this。
因此有下面的代码。
class A
{
int x;
public:
A() {x = 3;}
};
int main()
{
void* mem = operator new(sizeof(A));
A* obj = static_cast<A*>(new(mem)(A));
std::cout << obj->x << std::endl;
obj->A::~A();
std::cout << obj->x << std::endl;
}
我的第一个问题是:为什么我可以直接调用A的析构函数; 我的第二个问题是:为什么输出是:
3
3
调用析构函数后对象obj没有被删除?第二个3困扰我。
Why can I call the destructor?
因为是public个成员函数,可以调用public个成员函数
Why is the object not deleted?
在你的具体情况下,它仍然存在,因为 A
有一个微不足道的析构函数。
如果它有一个不平凡的,它会被删除,因为你不能再使用它了。不管怎样,你有 undefined behavior。
有关该内容的更详细讨论,请阅读 this。