我用这段代码在C++中试验析构函数:
#include <iostream>
struct temp
{
~temp() { std::cout << "Hello!" << std::endl; }
};
int main()
{
temp t;
t.~temp();
}我看到了“你好!”正在打印两次。析构函数的调用不应该释放对象吗?当析构函数超出作用域时,不应该再次调用它。还是有其他的概念呢?
(我不打算在实践中这样做。我只是想了解这里发生了什么。)
发布于 2012-08-09 21:11:59
它的发生是因为你让它发生。自动变量的析构函数总是在变量超出作用域时被调用。你也这么说过。总共打了两个电话。
调用对象的析构函数不会通知C++不要再次调用它,因为在正常执行中不需要跟踪。
解决方案是永远不要手动调用析构函数。
发布于 2012-08-09 21:13:43
调用析构函数不会释放对象。
析构函数的作用是清理对象的内部结构,然后在析构函数完成后释放对象本身。
做你正在做的事情是错误的,就像你可以在一个对象上调用delete两次一样,但是这样做是错误的。
只有极少数的情况下,你想手动调用析构函数,而这不是其中之一。它确实适用于这样的情况:你在内存位置手动构造一个对象,使用there new,然后需要能够在不释放内存的情况下销毁它。
发布于 2012-08-09 21:18:44
我看到了“
!”正在打印两次。析构函数的调用不应该释放对象吗?当析构函数超出作用域时,不应该再次调用它。还是有其他的概念呢?
是这样的。
我必须提一下,我并不打算在实践中这样做。我只是想知道这是怎么回事。
你调用了析构函数,准备销毁一个对象。但这也是在对象超出作用域时,在它被实际释放之前自动完成的。
需要理解的是:如果你做了一些没有意义的事情,那么糟糕的事情就会发生。所以不要做没有意义的事情。如果手动调用析构函数,则会运行析构函数。这对其他任何东西都没有影响,除非析构函数实际做了一些有影响的事情。
https://stackoverflow.com/questions/11884168
复制相似问题