C++:为什么它不调用析构函数?

标签 c++ class destructor

我在我的代码中使用了额外的括号。我想在局部变量作用域结束后应该何时调用析构函数,但它不是这样工作的:

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/

相关文章:

java构造函数访问(如果我们在子类中有私有(private)构造函数)

c++ - 嵌套类的成员函数返回嵌套类的类型

c++ - 当构造函数抛出异常时会运行哪些析构函数?

c++ - 为什么基于 C++ 范围的 for 循环在每次迭代时调用析构函数?

c++ - QT:未生成 ui_* 文件

c++ - 将 ioctl() 调用从 unix 移植到 linux,FIONBIO 出错

c++ - 如何在 QMainWindow 中设置多个标志?

c++ - XCode 中的 fprintf C 有问题

python - 从单独文件中的类创建对象

c++ - 为什么在删除对象之前调用复制构造函数?