C++派生类的析构函数是如何工作的?
展开全部
当构造一个派生类对象是,会先依次调用父类构造函数,然后在调用派生类构造函数;
当派生类对象被释放时,会以相反的顺序执行析构函数(也就算先执行派生类析构函数,然后依次向上执行父类析构函数),
首先,注意这里的析构函数释放的内存,指的并不是该对象的成员变量所占内存(对象成员变量所占内存是有编译器分配,存在于系统堆栈中,当函数退出后,就会不存在,否则一直都在,当然也许并没有被使用),析构函数释放的内存,一般指的是该对象成员函数中使用的动态申请内存,自己主动释放!
望采纳!
当派生类对象被释放时,会以相反的顺序执行析构函数(也就算先执行派生类析构函数,然后依次向上执行父类析构函数),
首先,注意这里的析构函数释放的内存,指的并不是该对象的成员变量所占内存(对象成员变量所占内存是有编译器分配,存在于系统堆栈中,当函数退出后,就会不存在,否则一直都在,当然也许并没有被使用),析构函数释放的内存,一般指的是该对象成员函数中使用的动态申请内存,自己主动释放!
望采纳!
更多追问追答
追问
当派生类对象被释放时,会以相反的顺序执行析构函数,你的意思就是先调用派生类的析构函数然后再调用基类的,这里细节是怎样的?是不是派生类的析构函数只负责释放自己新增数据成员的内存,剩下的成员由基类析构函数释放?
追答
孩子,,你又错了!真实的情况是:
不管是派生类自己新增的成员函数,还是父类的成员函数,他们所占内存都是出于系统堆栈中,由编译器自动分配,且自动回收。这里所说的析构函数释放内存指的是该内动态申请的内存,比如有些地方使用了new动态申请内存,因为这些内存必须有程序员自己释放,否则会造成内存泄露。
TableDI
2024-07-18 广告
2024-07-18 广告
VLOOKUP函数是Excel中用于数据匹配的重要工具。其使用方法是:在个参数中输入要查找的值,第二个参数是包含数据的范围或表格,第三个参数指定返回数据的列号,第四个参数(可选)决定查找方式(0为精确匹配,其他为近似匹配)。例如,假设我们想...
点击进入详情页
本回答由TableDI提供
展开全部
这个要分情况,特别是在多态的时候更要小心
一般情况下就像你说的,先自己析构再基类析构,但是如果你代码中存在多态行为,析构就要看基类的析构函数是否定义成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形式
一般情况下就像你说的,先自己析构再基类析构,但是如果你代码中存在多态行为,析构就要看基类的析构函数是否定义成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形式
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
析构函数是类在释放时执行清理工作的地方,清理过程主要包含两个部分,一是系统自动执行的部分,其机制是先调用基类的析构函数,让基类清除自己的资源,再调用类内部包含的对象的析构函数,其中这两种调用过程都是递归进行的,直到最顶层的类;还有一种是由用户代码执行清理的,这种往往是用户自己管理的资源,如动态申请的内存,系统的文件句柄,网络端口等。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
先调用自己的析构函数,再对象成员的,最后基类的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询