c++ - C++中的析构函数直接调用

标签 c++ destructor new-operator placement-new

因此是下面的代码。

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 .

关于c++ - C++中的析构函数直接调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30170603/

相关文章:

c++ - 优化 c++ 矩阵/位图类

.net - 使用 __declspec(thread) 的线程本地存储在 C++/CLI 中失败

php - 在析构时要求文件

c++ - 在 C++ 表达式的末尾键入名称;

c++ - T "decaying"数组的函数参数到指向 T 的指针?

C++ Combinatorics 组合高性能函数

c++ - 如何迭代结构体中的 unordered_map ?

c++ - 如果它是针对 vector 中的对象,是否会调用析构函数?

c++ - 覆盖 "new"并记录有关调用者的数据

javascript - "new <function>"后面的括号可选吗?