C++析构函数是否始终或仅在有时调用数据成员析构函数

Does a C++ destructor always or only sometimes call data member destructors?

本文关键字:析构函数 数据成员 调用 是否 C++      更新时间:2023-10-16

我试图验证我对C++析构函数的理解。

我已经读过很多次,如果我自己不编写一个,C++提供一个默认析构函数。 但这是否意味着如果我确实编写了一个析构函数,编译器仍然不会提供堆栈分配的类字段的默认清理?

我的预感是,唯一理智的行为是,无论我是否提供自己的析构函数,所有类字段都会被销毁。 在这种情况下,我读了很多次的声明实际上有点误导,可以更好地表述为:

"无论你是否编写自己的析构函数,C++编译器总是 写入默认的类似析构函数的序列以释放成员 类的变量。 然后,您可以指定其他 通过定义自己的析构函数根据需要进行分配或其他任务"

这是对的吗?

当一个对象在C++中被清理时,语言将

  • 首先调用类的析构函数,然后
  • 调用类的所有字段的析构函数。

(这假设没有继承;如果有继承,则通过递归地遵循相同的过程来销毁基类)。因此,您编写的析构函数代码只是除了单个数据成员的常规清理代码之外,还希望执行的自定义清理代码。您不会以某种方式"丢失"那些正常调用的对象的析构函数。

希望这有帮助!

是的

-- 对象中包含的任何对象都将作为销毁对象的一部分被销毁,即使/即使析构函数不执行任何操作来销毁它们。

事实上,析构函数通常不会执行任何操作来销毁对象中包含的对象;它通常做的是通过对象中的某些内容(例如,指向对象的指针、网络或数据库连接的句柄等)远程拥有的对象。

唯一常见的例外是,如果你的对象包含某种缓冲区,并且你已经使用放置new在该缓冲区中构造了一些东西。如果使用放置new,通常也计划直接调用 dtor。[请注意,"常见"可能夸大了你看到/使用它的频率 - 这确实非常罕见,但其他可能性仍然很少见。

是的。即使您确实编写了析构函数,C++编译器也会创建一个序列。请考虑以下代码:

class foo{
    int a;
}

编写一个解分配a析构函数,一个堆栈分配的变量...这是不可能的。因此,即使您编写自己的析构函数,C++编译器也必须生成一个析构函数来释放堆栈对象。

相关文章: