【问题标题】:What is a non-trivial destructor in C++?什么是 C++ 中重要的析构函数?
【发布时间】:2011-11-19 00:32:16
【问题描述】:

我正在阅读this,其中提到析构函数是微不足道和非微不足道的。

如果一个类有一个显式的析构函数 定义的析构函数,或者如果它有一个成员对象或基类 有一个重要的析构函数。

例如,我有一个班级,

class C {
    public:
     ~C(); // not explicitly declared.
};

如果 C::~C() 是隐式定义的,它会成为一个琐碎的 dtor 吗?

【问题讨论】:

    标签: c++ destructor


    【解决方案1】:

    你把你的话弄混了。您的示例确实声明一个显式析构函数。你也只是忘记定义它,所以你会得到一个链接器错误。

    规则很简单:你的类有明确的析构函数吗?如果是,那么你就很重要。如果不是,检查每个非静态成员对象;如果它们中的任何一个是不平凡的,那么你就是不平凡的。

    【讨论】:

    • 附带说明:C::~C() { } 仍然是一个重要的析构函数。即使你什么都不做,也什么都不做。编译器总是为你创建琐碎的析构函数/构造函数。
    • @CortAmmon:更准确地说,它需要隐式定义。如果它也是默认(必须在第一次声明时发生),则可以由用户声明。
    • 有趣的是,我不得不查一下。我知道 = 删除,但不知道 = 默认
    • @KerrekSB check each non-static member object; if any of them are non-trivial 我不明白,非平凡的非静态成员是什么意思?
    • @KerrekSB 1. non static non trivial object 是什么意思? 2. 你能提一下析构函数什么时候是trivial 类型吗?
    【解决方案2】:

    所以你的意思是,C 的整个声明是这样的:

    class C { };
    

    ?

    那么,是的:由于C 没有成员对象和基类,因此它没有具有非平凡析构函数的成员对象和具有非平凡析构函数的基类,因此其隐式定义的析构函数是平凡的一个。

    【讨论】:

      【解决方案3】:

      我认为一般来说它指的是一个析构函数,它实际上做了一些事情,例如:

      • 释放内存
      • 关闭与数据库的连接
      • 或者处理任何需要释放的资源

      在这种情况下,析构函数什么也不做。根据描述,从技术上讲,它可能是“不平凡的”,因为它定义了一个构造函数,但这并不重要,因为它什么都不做。

      【讨论】:

      • 它更像是一个可能做某事的析构函数。如果析构函数是在与使用类的代码不同的翻译单元中定义的(C.cppmain.cpp 或诸如此类),那么当编译器编译 main.cpp 时,它必须假定它需要调用 @987654324每当自动存储的C 实例超出范围时@ 的析构函数,因为它无法知道该析构函数实际上没有做任何事情。
      • "在这种情况下,析构函数什么都不做。" 你怎么知道?没有给出dtor的定义。
      • trivial destructor 是标准使用的技术术语,根据该术语的定义,OP 的 destructir 是非平凡的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-04
      • 2021-05-09
      • 2010-10-13
      • 2010-11-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多