C++虚析构函数和纯虚析构函数

C++虚析构函数和纯虚析构函数1、为什么要使用虚析构函数我们知道析构函数是在对象生命周期结束时自动被调用,用来做一些清理工作(如释放句柄,释放堆内存等),防止出现内存泄漏。那怎么还有虚析构函数呢?使用虚析构函数的类一般是要作为基类,被其他类继承。通过把基类的析构函数声明为虚函数,就可以通过父类指针来释放子类对象,从而完成子类的一些清理工作,防止出现内存泄漏。案例1:基类析构函数为非虚函数//test.hclassParent{public:Parent();~Parent

大家好,又见面了,我是你们的朋友全栈君。

1、为什么要使用虚析构函数

我们知道析构函数是在对象生命周期结束时自动被调用,用来做一些清理工作(如释放句柄,释放堆内存等),防止出现内存泄漏。

那怎么还有虚析构函数呢?

使用虚析构函数的类一般是要作为基类,被其他类继承。通过把基类的析构函数声明为虚函数,就可以通过父类指针来释放子类对象,从而完成子类的一些清理工作,防止出现内存泄漏。

案例1:基类析构函数为非虚函数

//test.h
class Parent
{
public:
        Parent();
        ~Parent();
private:
        int *p_ptr;
};

class Child : public Parent
{
public:
        Child();
        ~Child();
private:
        int *c_ptr;
};
//test.cpp
#include "test.h"
#include <iostream>

using namespace std;

Parent::Parent()
{
        p_ptr=new int;
        *p_ptr=10;
}

Parent::~Parent()
{
        cout << "Parent::~Parent() was called." << endl;
        if(p_ptr != 0)
        {
                delete p_ptr;
                p_ptr=0;
        }
}

Child::Child()
{
        c_ptr=new int;
        *c_ptr=20;
}
//main.cpp
#include "test.h"

void func(Parent *parent)
{
        delete parent;//通过父类指针来释放子类对象
}

int main(int argc, char *argv[])
{
        Child *child=new Child;

        func(child);
        return 1;
}

运行结果:

Parent::~Parent() was called.
结论:父类析构函数为非虚函数时,通过父类指针来释放子类对象时,只会调用父类的析构函数,而不会调用子类的析构函数,造成了子类的内存泄漏。所以,应该将父类的析构函数声明为虚函数。

案例2:父类的析构函数为虚函数

其他文件不用动,只需修改test.h,将父类的析构函数声明为虚函数。

//test.h
class Parent
{
public:
        Parent();
        virtual ~Parent();//虚析构函数
private:
        int *p_ptr;
};

class Child : public Parent
{
public:
        Child();
        ~Child();
private:
        int *c_ptr;
};

运行结果:

Child::~Child() was called.
Parent::~Parent() was called.
结论:只有将父类的析构函数声明为虚析构函数时,通过父类指针释放子类对象时,会先调用子类的析构函数,然后调用父类的析构函数,不存在内存泄漏问题。

2、纯虚析构函数

通过上面的虚析构函数知道,C++基类的析构函数最好声明为虚机构函数,那什么时候声明为纯虚析构函数呢?

我们知道,带有纯虚函数的类为抽象类,不能被实例化,只能被子类继承,所以当我们设计一个基类为抽象类时,可以把析构函数声明为纯虚析构函数,这样基类就是抽象类了。

注意:纯虚析构函数也要有函数体,用来做一些基类的清理工作,防止基类出现内存泄漏。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/149850.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • linux防火墙状态查看_linux查看iptables状态

    linux防火墙状态查看_linux查看iptables状态1.查看防火墙状态:active(running)即是开启状态:systemctlstatusfirewalld2.查看已开发端口命令:firewall-cmd–list-all3.新增防火墙开放端口:firewall-cmd–zone=public–add-port=3306/tcp–permanent4.开放端口后需要重新加载防火墙:firewall-cmd–reload5.firewalld的基本使用命令:启动:systemctls.

    2022年9月13日
  • php每秒执行一次_crontab每分钟执行shell脚本

    php每秒执行一次_crontab每分钟执行shell脚本作为php-slimWeb应用程序的一部分,在我的init.php文件中,我需要一个Crontab.php,其中包含以下代码://clearsanyexistingcrontabjobsfirstexec(“crontab-r”);$ctCommand='”*/1****php./ProcessCycleTimeData.php”‘;exec(“(crontab-…

    2022年8月30日
  • linux如何设置环境变量_linux用户环境变量

    linux如何设置环境变量_linux用户环境变量linuxfvwm作用FVWM窗口管理器最早是对TWM的修改,可以追溯到1993年。经过几年的迭代,出现了一个可高度自定义的环境,其中可以配置任何行为,动作或事件。它支持自定义键绑定,鼠标手势,主题,脚本等。尽管FVWM在安装后立即可用,但其默认发行版仅提供绝对的最低配置。这是启动自己的自定义桌面环境的良好基础,但是,如果您只想将其用作桌面,则可能要安装由另一个用户分发的完整配置。…

    2022年9月28日
  • 51单片机最小系统的制作

    51单片机最小系统的制作本文将介绍如何自制一个51单片机最小系统及一些附加模块。最终制成的系统将具有烧录程序,运行程序等功能。先放两张张最终成品如下 ​                                        (正面)                  (反面–锡接走线法)提醒读者,下载口的布局有点

    2022年6月23日
  • 深入了解ZooKeeper(一)

    1.内容思维导图2.分布式协调技术在进程间通讯中为了防止资源的竞争和抢占,我们有很多方法(如原子函数,互斥锁,事件,信号等)去实现临界资源的有序访问。那么处于分布式的环境中时,我们又该如何去处

    2021年12月28日
  • python爬虫-数据解析(xpath)

    python爬虫-数据解析(xpath)

    2021年4月16日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号