【发布时间】:2019-10-16 11:36:35
【问题描述】:
在一个类中(没有直接指针成员),我看到定义析构函数有以下 3 种可能性。
class Child : public Parent
{
public:
// ~Child() override {} // (1) explicit destructor with empty body
// ~Child() override = default; // (2) explicit default destructor
// // (3) implicit default destructor
private:
// members
}
可以/应该始终避免选项(1) 吗?因为如果我使用选项 (1),Clang-Tidy 会提示我选择选项 (2)。
这三个不同的选项一般有什么区别?选择一个而不是其他应该考虑什么?
【问题讨论】:
-
还有第四版
~Child() override;,在源文件中有单独的定义,例如Child::~Child() = default。例如,这对于 PIMPL-via-unique-ptr 很重要,其中指针的值类型必须在析构函数中完整(参见 eerorika 的答案)。你的 3 个版本都不能在这里工作。 -
我得到的指导是使用
~Child();(没有虚拟或覆盖标签),或者如果析构函数的默认行为已经正确,因为没有要释放的资源,那就更好了,根本不提供。 -
@MaxLanghof 假设代码是可编译的,
override关键字意味着Parent(或其父级之一)具有virtual析构函数。还是我把你的问题弄错了? -
@Sumudu 你是对的,我不知何故完全错过了
override。抱歉打扰了!
标签: c++ memory-management c++14 destructor virtual-destructor