【问题标题】:Can an empty destructor cause harm? [duplicate]空的析构函数会造成伤害吗? [复制]
【发布时间】:2016-07-05 09:38:09
【问题描述】:

我是 C++ 新手,我正在努力理解的概念之一是析构函数。出于好奇,不必要的(例如,当一个类没有动态分配的内存、资源或任何需要用户定义的析构函数时)和空析构函数会导致任何无法预料的问题吗?

编辑:我知道这部分内容已在 Will an 'empty' constructor or destructor do the same thing as the generated one? 中得到解答,但我想扩展它以询问更多关于一般性负面后果的信息,例如崩溃或使应用程序变慢。有一些重叠,但这是一个略有不同的问题。

【问题讨论】:

  • @mkaes 这是一个比你提到的更广泛的问题
  • @SomeWittyUsername:问题本身可以解释为“更广泛”,但链接问题中的答案仍然回答了这个问题。所以我仍然认为这个问题应该结束。
  • @mkaes 我正在寻找与该问题(我已阅读)中包含的更多/略有不同的信息。希望我的编辑能澄清一点。
  • 好吧,一个空的析构函数会导致内存泄漏,这很糟糕。但是我认为您应该使问题更准确,大多数回答者都没有这样阅读。我猜你试图排除“当一个类没有动态分配的内存时”,但你应该排除“当一个类没有资源时”。例如,如果它拥有这些东西的“原始”C 句柄并且没有 dtor,它可能仍然会泄漏文件或套接字。
  • @ChrisBeck 感谢您指出这一点,如果我最近的编辑仍不清楚,请告诉我。

标签: c++ c++11


【解决方案1】:

析构函数的琐碎性还有一个有趣的方面(在链接的副本中似乎没有讨论)。编译器生成的(或defaulted)析构函数被认为是普通析构函数,拥有普通析构函数是你的类成为POD类型的先决条件。用户定义的析构函数,即使为空,也会阻止您的类成为 POD 类型。

拥有 POD 类型有时非常重要。例如,POD 类型可以是 memcpyed 或实体序列化。

【讨论】:

  • 谢谢,我还没有处理 memcpy 但这是非常有用的信息。
  • @ce_nort - 你不应该处理memcpy。不会很久很久。
【解决方案2】:

“空析构函数”有点用词不当。无论您的析构函数是否有主体,编译器仍会生成代码以按相反的声明顺序调用每个非静态成员变量和基类的析构函数。如果您希望在调用其他析构函数之前做某事,您只需要一个主体。

【讨论】:

    【解决方案3】:

    这个问题取决于几个参数。空虚并不是唯一影响结果的东西。例如,如果您没有定义 virtual 析构函数(是否为空),则在从类继承时会出现问题。另一方面,如果你在privateprotected 部分定义了一个空的析构函数,它将阻止在堆栈上创建类的实例。

    【讨论】:

    • 问题行为并非来自继承,而是来自通过指向基类型的指针删除。
    • @PeteBecker 是的。我的意思是,在使用多态对象时,通过指向基址的指针进行删除是一种非常常见且基本的操作。
    • @PeteBecker,是的,除非您在某个时候通过 base 删除它们,否则您不太可能从多态对象中受益。
    • @SomeWittyUsername - 确实;但基类并非专门用于多态类型。例如,标准库中的几个基类没有虚拟析构函数,也不需要它们。
    • @PeteBecker,是的,答案没有提到多态对象!我没看见它。我同意你的看法,SWU 应该特别提到这些。
    【解决方案4】:

    没有。事实上,如果你不为类或结构声明和编写析构函数,编译器会为你做这件事——它会是空的。

    【讨论】:

    • 嗯。我认为光头的“错误”有点苛刻。如果有人开始掌握“析构函数”是什么,他们在一段时间内不会担心 POD 类型。 (而且我真的想不出一个很好的理由来使用 memcpy 而不是 assignment/std::copy)
    • 但是有区别,所以说没有区别是不对的。至于memcpystd::copy 在这里根本不适用)的好处,而不是写赋值运算符只是性能和代码类型。出于性能原因,默认分配操作员将为 POD 调用 memcpy,而不是通过成员复制来调用。
    【解决方案5】:

    不,实例的所有成员在您的析构函数运行后仍会被销毁。析构函数唯一不能做的是抛出异常,否则它可能会做任何“正确”方法可以做的事情,即什么也不做也没关系。不应该关闭句柄是另一个问题。

    【讨论】:

      猜你喜欢
      • 2014-12-28
      • 1970-01-01
      • 2012-01-10
      • 2019-12-12
      • 1970-01-01
      • 2010-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多