你如何在 C++ 中定义解构函数?

How do you define a deconstructor in c++?

刚开始学习 C++,我对如何编写解构函数感到困惑。到目前为止,我知道每当对象被销毁时都会调用解构函数,根据我的理解,这是程序结束并且 C++ 自动销毁所有对象的时间。这是否意味着我应该将所有变量重新初始化为它们原来的样子?

所以这是我应该拥有的:

/*In the Header file*/
List();
~List();

//Other function prototypes go here


/*In the Implementation file*/
List::List()
{
  head = NULL;
  tail = NULL;
  count = 1;
}

List::~List
{
  head = NULL;
  tail = NULL;
  count = 1;
}

//Other function bodies go here

没有。析构函数用于 deallocating/cleaning 对象可能正在使用的任何资源。例如需要关闭文件句柄,需要将 UI 资源释放回系统,需要 deleteed deleteed 的内存。

在你的例子中,计数看起来像一个 int,所以你不需要为此做任何事情,因为它的内存是被销毁对象的一部分,但是如果你已经为你的列表你将不得不在析构函数中释放它。根据您构建列表的方式,您可能希望遍历列表并释放每个节点。

叫析构函数不叫析构函数

析构函数代码通常定义如何结束 class.

实例的生命周期

通常这将包括内存释放或释放以及资源释放'closing a file handle',解锁同步器,它还可能包括更复杂的东西,例如如果此线程生命周期在内部,则中断线程以结束其生命class.. 它可能不止于此,例如向已分配通知的任何人通知有关 class 的销毁.. 结束实例时可能需要很多代码class 如果没有析构函数,OOP 的封装会受到影响

C++ 中的最后一个注释,new 和 delete 保留字是使用对象实例 constructor/destructor 的内存分配器

我希望它足够清楚

为了消除一个误解,只要对象超出范围(局部变量到达创建它的代码块的末尾),就会调用析构函数。如果一个对象是在全局范围内(函数之外)创建的,它将在程序退出时被销毁。将其视为围绕整个程序的一大组括号。

void function(object a)
{
    object b;
    int x = 0;
    while (x < 10)
    {
        object c;
        // La la la Doing stuff.
    } // c destroyed here. It will be created and destroyed for each run through the loop
    a = b;
} //b destroyed here 
// a also destroyed here, so watch out passing things into functions if you want them 
// back changed.

或者用delete命令手动销毁时

object * d = new object();
// la la la doing stuff
delete d;

由于d是手动创建的,所以必须手动销毁。当心 C# 和 Java 人。

你需要在析构函数中做什么?

收起一切。不要浪费时间将值设置回默认值。他们待的时间不够长,无法欣赏这种姿态。但是,如果您打开了一个文件,并且它仍然处于打开状态,请将其关闭。如果您 new 编辑了其他对象,则 delete 它们。如果您锁定了互斥量,请将其解锁。如果您正在管理线程,您可能希望通知线程并等待它们完成后再完成。但是要超时,这样你就不会挂在卡住的线程上。

在我们讨论主题时,请阅读以下内容:What is The Rule of Three?

简单地说,三原则意味着如果你有一个析构函数、一个复制构造函数或一个赋值运算符 (operator=),你几乎肯定需要这三个。很多时候你会看到人们因为不遵守三规则而出现奇怪的记忆错误。不要成为那个人。

当你有三法则时,去寻找五法则。

这如何适用于 OP:

List::~List
{
  head = NULL; //very probably need to delete this pointer
  tail = NULL; //and possibly this one
  count = 1; // don't need this at all
}

所以它应该看起来像:

List::~List
{
    if (head != NULL)
    {
        delete head; // This should start a chain reaction deleting all of the linked 
                     // items in the list, ensuring that they have all been freed
    }
}

此外,OP 应该有一个复制构造函数和一个赋值运算符,以确保在删除列表时它不会同时删除列表的任何副本的数据。