为了账号安全,请及时绑定邮箱和手机立即绑定

virtual虚析构函数不会造成内存的重复释放吗?

int main() {
    //Soldier soldier;
    Person *p = new Soldier;
    p->play();
    delete p;
    p = NULL;

    system("pause");
    return 0;
}

Person
Soldier
Person -- play
James
~Soldier
~Person

从堆中分配一块内存创建Soldier的对象,

执行Soldier的析构函数~Soldier之后就释放掉了该内存,

那么在执行Person的虚构函数~Person不会造成内存的重复释放呢?

为什么呢?


正在回答

3 回答

最开始的时候执行了Person和Soldier的构造函数,如果不加虚析构函数的话  你会看到就只释放了Person的析构函数,这样就少释放了Soldier的析构函数,加了的话就会有~Soldier和~Person,一样各执行了一次,没有重复释放ka ,不知这样理解得对不对。

0 回复 有任何疑惑可以回复我~
#1

慕姐3585284 提问者

嗯。 使我困惑的是: 假设向堆中申请的内存大小是10,那么执行~Soldier()的时候释放的不是10吗? 如果是10,那么执行~Person()的时候是不是释放的是Person对象大小的内存? 这样是不是会重复释放? 我是猜想,C++大概有什么机制处理虚析构函数释放内存的情况,想搞清楚的是这里。
2016-09-27 回复 有任何疑惑可以回复我~
#2

慕姐3585284 提问者

我好像想得太多了。o(╯□╰)o 可能是短时间内看了太多的内容,没能吸收。 要再好好梳理一遍。
2016-09-28 回复 有任何疑惑可以回复我~
#3

慕姐3585284 提问者

非常感谢!
2016-09-28 回复 有任何疑惑可以回复我~
#4

wallEVA96 回复 慕姐3585284 提问者

看一下虚函数指针,虚函数列表。
2019-01-21 回复 有任何疑惑可以回复我~
查看1条回复

好像是获取控件出错了,把LinearLayoutnbsp;按照TextViewnbsp;来进行获取了,你检查一下看看LinearLayout的id和TextView的id线Java

0 回复 有任何疑惑可以回复我~

其实我也和你一样  “可能是短时间内看了太多的内容,没能吸收。”光看明白不难,但容易忘,要理解为什么及其中的原理等等 才算是掌握吧应该

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
C++远征之继承篇
  • 参与学习       75188    人
  • 解答问题       251    个

继承,C++面向对象三大特征之一,通过编码实践方式讲解到操作层面

进入课程

virtual虚析构函数不会造成内存的重复释放吗?

我要回答 关注问题
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号