【发布时间】:2013-08-08 11:32:26
【问题描述】:
我在代码中使用了额外的括号。我认为在局部变量范围结束后应该调用析构函数,但它不是这样工作的:
class TestClass {
public:
TestClass() {
printf( "TestClass()\n" );
}
~TestClass() {
printf( "~TestClass()\n" );
}
};
int main() {
int a, b, c;
{
TestClass *test = new TestClass();
}
}
它输出:
TestClass()
所以它没有调用 TestClass 的析构函数,但为什么呢?如果我手动调用它(删除测试),它会调用析构函数,对。但是为什么它在第一种情况下不调用析构函数呢?
【问题讨论】:
-
因为如果你用
new创建一个对象,它只能在调用delete时被破坏——它不会因为超出范围而被破坏。 -
@Nbr44:不完全正确。您可以直接调用析构函数。当然,这不会释放内存,但会破坏对象。那么,在没有未定义行为的情况下正确释放内存的唯一方法是在其位置构造另一个相同类型的对象(通过放置 new)并在其上调用 delete。
标签: c++ class destructor