如何正确实现C ++类析构函数

问题描述 投票:1回答: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)吗?因为如果我使用选项(2),Clang-Tidy会提示我采用选项(1)

一般而言,三个不同选项之间有什么区别?选择一个以上时应考虑什么?

c++ memory-management c++14 destructor virtual-destructor
3个回答
0
投票

可以/应该始终避免选择(1)吗?

如果没有什么可放入析构函数的,则应让编译器为您生成一个default析构函数,所以是。

一般而言,三个不同选项之间有什么区别?

假设不需要在析构函数中放置任何特殊内容:

  1. 您将destrucor锁定为空,如果情况发生变化,您可能会忘记将其添加到析构函数中。

  2. 让编译器弄清楚这一切,并在代码中显示您正在执行此操作。

  3. 让编译器将其全部弄清楚,并且不要在代码中显示您正在执行此操作。


0
投票

可以/应该始终避免选择(1)吗?

是。据我所知,使用空非默认析构函数的唯一原因是支持C ++ 03和更早的标准。

选择一个之上的应考虑什么?

    1. 和3.具有在所有C ++版本中都有效的优点。
    1. 和3.只要成员是易碎的,就具有琐碎的优势。
    1. 具有最少写入量和最少读取量的优点,并且在大多数情况下等于2。

0
投票

C ++使用RAII原理。密切相关的是The rule of three/five/zero

它是这样的:

  • 如果您的类是资源的所有者,则它必须实现所有3/5特殊成员(复制/移动构造函数,复制/移动分配和析构函数),以遵守RAII原则
  • 如果您需要定义3/5个特殊成员中的至少一个,那么您的课程很可能拥有资源,因此您必须定义所有3/5个特殊成员
  • 如果您的班级拥有资源,那么它必须专门处理该资源的预订。否则,它不应定义任何提及的特殊成员(零规则)。

您肯定处于所有规则的零规则之内。因此,您需要具有隐式析构函数。

© www.soinside.com 2019 - 2024. All rights reserved.