首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++析构函数是否总是或仅有时调用数据成员析构函数?

C++析构函数是否总是或仅有时调用数据成员析构函数?
EN

Stack Overflow用户
提问于 2013-11-09 03:34:31
回答 3查看 2.9K关注 0票数 10

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

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

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

“无论您是否编写您自己的析构函数,C++编译器总是编写一个默认的析构函数类序列,以释放类的成员变量。然后,您可以通过定义自己的析构函数来指定额外的解构函数或其他需要的任务”

这是正确的吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-11-09 03:36:24

在C++中清除对象时,该语言将

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

(这不假定继承;如果存在继承,则基类将按照相同的过程递归销毁)。因此,您编写的析构函数代码只是您想要做的自定义清理代码,以及单个数据成员的常规清理代码。您不会以某种方式“丢失”那些被调用为普通对象的析构函数。

希望这能有所帮助!

票数 25
EN

Stack Overflow用户

发布于 2013-11-09 03:49:19

是的--任何包含在你的物体中的物体都会被摧毁,即使你的毁灭者没有做任何事情来摧毁它们。

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

这种情况的唯一例外是,如果您的对象包含某种类型的缓冲区,并且您已经使用placement new在该缓冲区中构造了一些东西。如果使用plan new,通常也计划直接调用dtor。请注意,“常见”可能夸大了您看到/使用这个的频率--这是非常罕见的,但其他可能性则更少。

票数 2
EN

Stack Overflow用户

发布于 2013-11-09 03:42:31

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

代码语言:javascript
复制
class foo{
    int a;
}

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19872072

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档