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