C++派生类的析构函数是如何工作的?

是先调用析构函数释放自己新增数据成员的内存后,再调用基类析构函数释放其基类成员内存还是?... 是先调用析构函数释放自己新增数据成员的内存后,再调用基类析构函数释放其基类成员内存还是? 展开
 我来答
树礼梨m
2013-08-02 · TA获得超过417个赞
知道小有建树答主
回答量:926
采纳率:75%
帮助的人:132万
展开全部
当构造一个派生类对象是,会先依次调用父类构造函数,然后在调用派生类构造函数;
当派生类对象被释放时,会以相反的顺序执行析构函数(也就算先执行派生类析构函数,然后依次向上执行父类析构函数),

首先,注意这里的析构函数释放的内存,指的并不是该对象的成员变量所占内存(对象成员变量所占内存是有编译器分配,存在于系统堆栈中,当函数退出后,就会不存在,否则一直都在,当然也许并没有被使用),析构函数释放的内存,一般指的是该对象成员函数中使用的动态申请内存,自己主动释放!

望采纳!
更多追问追答
追问
当派生类对象被释放时,会以相反的顺序执行析构函数,你的意思就是先调用派生类的析构函数然后再调用基类的,这里细节是怎样的?是不是派生类的析构函数只负责释放自己新增数据成员的内存,剩下的成员由基类析构函数释放?
追答
孩子,,你又错了!真实的情况是:
不管是派生类自己新增的成员函数,还是父类的成员函数,他们所占内存都是出于系统堆栈中,由编译器自动分配,且自动回收。这里所说的析构函数释放内存指的是该内动态申请的内存,比如有些地方使用了new动态申请内存,因为这些内存必须有程序员自己释放,否则会造成内存泄露。
TableDI
2024-07-18 广告
VLOOKUP函数是Excel中用于数据匹配的重要工具。其使用方法是:在个参数中输入要查找的值,第二个参数是包含数据的范围或表格,第三个参数指定返回数据的列号,第四个参数(可选)决定查找方式(0为精确匹配,其他为近似匹配)。例如,假设我们想... 点击进入详情页
本回答由TableDI提供
jhx1008
推荐于2018-04-11 · TA获得超过617个赞
知道小有建树答主
回答量:336
采纳率:0%
帮助的人:321万
展开全部
这个要分情况,特别是在多态的时候更要小心
一般情况下就像你说的,先自己析构再基类析构,但是如果你代码中存在多态行为,析构就要看基类的析构函数是否定义成vritual了,如果没有就只调用基类析构,如下:
class A
{
public:
A(){};
~A(){}
};
class B : public A
{
public:
B(){};
~B(){};
};

如果你的代码只是:
B *b = new B; delete b;那是肯定先调B的析构,然后调A的析构
但是如果是这样的多态形式
A *a = new B; delete a; 这个时候的析构只调用了基类A的析构,如果把A的析构函数定义成virtual的,那就会先调B的析构,然后调A的,所以涉及到继承的,最好把父类的析构函数定义成vritual形式
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
FreeMyslef
2013-08-02 · 超过16用户采纳过TA的回答
知道答主
回答量:55
采纳率:0%
帮助的人:27.1万
展开全部
析构函数是类在释放时执行清理工作的地方,清理过程主要包含两个部分,一是系统自动执行的部分,其机制是先调用基类的析构函数,让基类清除自己的资源,再调用类内部包含的对象的析构函数,其中这两种调用过程都是递归进行的,直到最顶层的类;还有一种是由用户代码执行清理的,这种往往是用户自己管理的资源,如动态申请的内存,系统的文件句柄,网络端口等。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
limanfeiday
2013-08-02 · 超过14用户采纳过TA的回答
知道答主
回答量:43
采纳率:0%
帮助的人:33.8万
展开全部
先调用自己的析构函数,再对象成员的,最后基类的
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式