我在我的代码中使用了额外的括号。我想在局部变量作用域结束后应该何时调用析构函数,但它不是这样工作的:
class TestClass {
public:
TestClass() {
printf( "TestClass()\n" );
}
~TestClass() {
printf( "~TestClass()\n" );
}
};
int main() {
int a, b, c;
{
TestClass *test = new TestClass();
}
}
输出:
TestClass()
所以它没有调用 TestClass 的析构函数,但为什么呢?如果我手动调用它(删除测试),它会调用析构函数,对吧。但是为什么它在第一种情况下不调用析构函数呢?
最佳答案
TestClass *test = new TestClass();
您使用 new
创建一个动态分配的对象(很可能放在堆上)。此类资源需要由您手动管理。通过管理,您应该在使用完之后对其使用delete
。
{
TestClass *test = new TestClass();
// do something
delete test;
}
但对于您的大多数目的和意图,您只需要使用自动存储对象,这样您就可以免去手动管理对象的麻烦。它也很可能具有更好的性能,尤其是在短期对象中。 你应该总是喜欢使用它们,除非你有充分的理由不这样做。
{
TestClass test;
// do something
}
但是,如果您需要动态分配对象或指针的语义,最好使用某种机制为您封装对象/资源的删除/释放,这也为您提供额外的安全性,尤其是在您正在使用异常和条件分支。在你的情况下,如果你使用 std::unique_ptr
会更好.
{
std::unique_ptr<TestClass> test(new TestClass());
// auto test = std::make_unique<TestClass>(); in C++14
// do something (maybe you want to pass ownership of the pointer)
}
以下是帮助您决定是使用自动存储对象还是动态分配对象的相关链接:Why should C++ programmers minimize use of 'new'?
关于C++:为什么它不调用析构函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18097478/