【问题标题】:Is it good programming practice to create my Destructors? [closed]创建我的析构函数是一种好的编程习惯吗? [关闭]
【发布时间】:2018-12-01 06:20:57
【问题描述】:

我的 c++ 书说,“当对象被销毁时会自动调用析构函数”。那么,如果我不打算在其中包含任何类似于以下示例的代码,那么创建一个是好还是坏的做法?

我书中的例子是:

Demo::~Demo()
{
    cout << "Now the destructor is running.\n";
}

【问题讨论】:

  • 如果你不写一个,编译器会自动给你一个空的。如果您需要(或想要)做一些特别的事情,那就写一个。如果您需要编写析构函数,请注意rule of 3/5/0,因为您可能还需要编写其他构造函数和赋值运算符。
  • 编译器会自动为你生成析构函数。如果/当生成的不符合您的要求时,您应该编写自己的。
  • @SidS,你能举个例子吗?
  • @Sid S 我想说这样的说法需要一个证明的例子。
  • @SidS 你能提供一个关于godbolt.org 的例子吗?

标签: c++ destructor explicit-destructor-call


【解决方案1】:

记住rule of three

三法则(也称为三巨头或三巨头)是 C++(C++11 之前)中的一条经验法则,它声称如果一个类定义了一个(或多个)以下它可能应该明确定义所有三个:1

  • 析构函数
  • 复制构造函数
  • 复制赋值运算符

【讨论】:

  • 还要记住5的规则和0的规则。
  • 通常只有当类动态分配需要在销毁时释放的资源时才需要显式析构函数。在大多数此类情况下,更好的选择是使用容器或智能指针来自动释放其包含的资源 - 无需显式析构函数。
  • @JesperJuhl 不是真的。确实,动态分配的资源是需要析构函数的一种情况,但还有其他情况。最容易想象的是一个计算实例数量的类。 5 法则是黄金法则。不管我怎么努力,我都想不出一个理智的类需要理智的复制构造函数,但不需要析构函数的情况。
  • @Jesper:加入线程、关闭套接字、编写“页脚”以打开文件、刷新缓冲区(不是 C++ 文件流!其他类型的缓冲区)都是编写自己的析构函数的好理由。析构函数不仅仅用于内存管理。你确实说“通常”而不是“总是”,但我仍然认为你的评论有点误导。
  • @Lightness Races in Orbit - 我知道。也许你没有注意到我写了“......需要释放的动态分配的资源......”——这些资源当然不需要是内存,它们可以是(几乎)任何东西。你想说啥?要加入的线程、套接字等我都考虑动态分配的资源。写页脚,不,不是动态资源,但如果你想这样做,很明显你想在 dtor 中这样做。
猜你喜欢
  • 2019-02-01
  • 2017-10-11
  • 2015-02-18
  • 2021-03-15
  • 2012-04-23
  • 2013-03-30
  • 2021-04-11
  • 2016-03-20
相关资源
最近更新 更多