C++析构函数总是调用数据成员析构函数吗?

thigvfpy  于 11个月前  发布在  其他
关注(0)|答案(3)|浏览(115)

我正在验证我对C析构函数的理解。
我读过很多次C
提供了一个默认的析构函数如果我自己不写一个析构函数。但是这是否意味着如果我写了一个析构函数,编译器仍然不会提供默认的清理堆栈分配的类字段?
我的直觉是,唯一明智的行为是,所有的类字段都被销毁,无论如何,无论我是否提供自己的析构函数。在这种情况下,原始语句中的 *if子句 * 实际上有点误导,可以更好地表述为:
无论是否编写自己的析构函数,C++编译器总是编写一个类似于析构函数的默认序列来释放类的成员变量。然后,您可以通过定义自己的析构函数来指定其他释放或其他任务。
是这样吗?

ux6nzvsh

ux6nzvsh1#

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

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

(This没有继承权;如果有继承,基类会被递归地销毁)。因此,你写的析构函数代码只是自定义的清理代码,除了为单个数据成员做正常的清理代码之外,你还想做一些自定义的清理代码。你不会以某种方式“丢失”那些被正常调用的对象的析构函数。
希望这对你有帮助!

bfhwhh0e

bfhwhh0e2#

是的--包含在你的对象中的任何对象都将作为销毁你的对象的一部分而被销毁,即使你的析构函数没有销毁它们。
事实上,析构函数通常不会做任何事情来销毁对象中包含的对象;它通常会销毁通过对象中的某些东西(例如,指向对象的指针,网络或数据库连接的句柄等)远程拥有的对象。
唯一常见的例外是,如果对象包含某种类型的缓冲区,并且您使用了placement new来构造该缓冲区中的内容。如果您使用placement new,则通常也会计划直接调用dtor。[注意,“common”可能夸大了您看到/使用它的频率--它真的很少见,但其他的可能性就更少了

xeufq47z

xeufq47z3#

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

class foo{
    int a;
}

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

相关问题