C++语言:虚析构函数
小标 2018-07-25 来源 : 阅读 1150 评论 0

摘要:本文主要向大家介绍了C++语言:虚析构函数,通过具体的内容向大家展示,希望对大家学习C++语言有所帮助。

本文主要向大家介绍了C++语言:虚析构函数,通过具体的内容向大家展示,希望对大家学习C++语言有所帮助。

我知道,对于存在虚函数的基类,一般需要将基类的析构函数定义为虚函数,从而实现资源的合理释放,而且我也知道派生类在重载时,只需要清理自己的对象,不过,有时候还是会有些疑惑感,所以写了一个简单的例子,来消除疑惑。下面是实例内容:

 

#include <iostream>

class student

{public:

    student() {}

    ~student() { std::cout << "a student" << std::endl; }

};

class bachelor

{public:

    bachelor() {}

    ~bachelor() { std::cout << "a bachelor" << std::endl; }

};

class studentHolder

{public:

    studentHolder()

    {

 

    }

 

    virtual ~studentHolder() {}

 

private:

    student st;

};

class bachelorHolder : public studentHolder

{public:

    bachelorHolder()

        : studentHolder()

    {

 

    }

 

    ~bachelorHolder() override

    {

 

    }

private:

    bachelor bcl;

};

 

下面是调用的地方的代码:

 

#define _CRTDBG_MAP_ALLOC

#include <stdlib.h>

#include <crtdbg.h>

int main()

{

    _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);

    studentHolder* holder = new bachelorHolder();

    delete holder;

    return 0;

}

 

这种情况下,会执行正确的清理操作:

 

这种情况下,如果将bachelorHolder中的析构函数删除,即:

 

class bachelorHolder : public studentHolder

{public:

    bachelorHolder()

        : studentHolder()

    {

 

    }

private:

    bachelor bcl;

};

 

这种情况下,对象依然被很好的清理,因为C++会默认为类创建一个析构函数,而且如果基类为虚函数,派生类创建的为重写基类的虚函数。结果依然是:

 

如果在上述的情况下,将studentHolder析构函数的virtual移除,即:

 

class studentHolder

{public:

    studentHolder()

    {

 

    }

 

    ~studentHolder() {}

 

private:

    student st;

};

 

结果将变成:

 

不过,注意一点,这里,只是说派生类的析构函数没有被调用,资源(分配的堆内存)还是会被很好的释放。这里,可以查看,如果我们将main函数中的delete holder;注释掉:

 

int main()

{

    _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);

    studentHolder* holder = new bachelorHolder();

    // delete holder;

    return 0;

}

 

在debug模式下,进行调试,会在output窗口,得到如下结果:

 

而就算将main函数,改为如下:

 

int main()

{

    _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);

    studentHolder* holder = new bachelorHolder();

    delete reinterpret_cast<void*>(holder);

    return 0;

}

 

在output窗口,都不会出现内存泄漏的显示。大致内容就是上述显示,在有疑虑的时候,可以参考一下。

本文由职坐标整理并发布,了解更多内容,请关注职坐标编程语言C/C+频道!


本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程