我用这段代码在C++中试验析构函数:
#include <iostream>
struct temp
{
~temp() { std::cout << "Hello!" << std::endl; }
};
int main()
{
temp t;
t.~temp();
}
Run Code Online (Sandbox Code Playgroud)
我看到"你好!" 正在打印两次.不应该调用析构函数释放对象,并且当它超出范围时不应该再次调用析构函数吗?或者还有其他一些概念吗?
(我不打算在实践中这样做.我只是想了解这里发生了什么.)
Jon*_*pan 43
它发生是因为你说它发生了.当变量超出范围时,始终会调用自动变量的析构函数.你也叫它.总共有两个电话.
调用一个对象的析构函数不会向C++发出信号,不再调用它,因为在正常执行中没有必要跟踪.
解决方案是永远不要手动调用析构函数.
jco*_*der 20
调用析构函数不会释放对象.
析构函数用于清理对象的内部,然后在析构函数完成后释放对象本身.
这是对你也同样这样做,以你的方式有什么错误可以调用对象上删除两次,但它是这样做的错误.
只有极少数情况下你想手动调用析构函数,而这不是其中之一.在你使用placement new手动构建一个内存位置的对象时,它确实存在,然后需要能够在不释放内存的情况下对其进行破坏.