是不是提供了明确的析构函数不好的做法?

Cri*_*ter 6 c++ destructor

如果我没有为C++类提供显式的析构函数,因为我确信编译器提供的默认析构函数是我所有类的需求,那很好吗?或者这被认为是不好的做法?

Naw*_*waz 6

仅在两种情况下需要显式析构函数:

  • 当您需要运行时多态性时.在这种情况下,基类析构函数需要virtual- 此要求强制您显式定义析构函数(即使它是空的!).但是,派生类可能有也可能没有显式析构函数,具体取决于它们是否管理资源(这是第二个要点).

  • 当您的类是资源管理类时 - 也就是说,它实现了RAII习语.在这种情况下,您可能还需要实现copy-semantics和move-semantics.

在所有其他情况下,不需要显式定义的析构函数.:-)


Com*_*sMS 6

提供显式析构函数的主要优点是您可以轻松地在其中放置断点以进行调试。有些人喜欢这样,因此更喜欢给每个类一个明确的析构函数。

但是,如果该类足够简单,很明显默认构造函数就足够了,那么省略它就完全没问题了。另请注意,添加析构函数确实有其缺点:除了代码中的额外噪音外,添加析构函数可能会阻止您的类成为POD。所以你仍然应该避免在你的代码中无意识地传播琐碎的析构函数。

我认为省略空的非虚拟析构函数有害的唯一情况是,为什么析构是微不足道的(例如,如果规则/五规则表明您需要一)。在这种情况下,我仍然会提供一个显式的空析构函数,并在正文中注释为什么什么都不做是安全的。但这更多是个人偏好而不是固定规则。

  • @Korchkidu 我会将不必要的析构函数视为代码作者不知道他们在做什么的标志。对我来说,这是分散注意力的噪音。 (4认同)
  • 仅出于调试原因提供析构函数应该只是暂时完成。您不想让数百个析构函数弄乱您的代码,因为您可能在绝望的时候需要其中的一两个。不过,对于 Ro3(自 C++11 起为 Ro5)的显式默认析构函数的好处。 (3认同)
  • @Korchkidu 请注意,不加选择地提供显式析构函数可能是阻止您的类成为 C++03 中的 POD 的唯一原因。 (2认同)