码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 70.C++虚析构函数


    今天进行了新的学习。

    目录

    1.什么是虚析构函数

    2.为什么需要虚析构函数

    3.虚析构函数的声明

    4.派生类中的析构函数

    5.使用虚析构函数


    1.什么是虚析构函数

            虚析构函数是在C++中用于处理继承层次结构中的资源释放的一种技术。它在析构函数前加上 virtual 关键字,以允许正确地销毁派生类对象,即使通过基类指针删除派生类对象也能保证资源正确释放。

    以下是虚析构函数的一些关键概念和用法:

    2.为什么需要虚析构函数

    • 当基类指针指向一个派生类对象,并且通过该指针删除对象时,通常只会调用基类的析构函数。这可能导致派生类特有的资源(如动态分配的内存)不会得到正确释放,从而产生内存泄漏。

    • 通过将析构函数声明为虚函数,可以确保在删除派生类对象时调用派生类的析构函数,从而正确释放派生类的资源。

    3.虚析构函数的声明

    • 在基类中,将析构函数声明为虚函数,即在析构函数前加上 virtual 关键字。
    1. class Base {
    2. public:
    3. virtual ~Base() {
    4. // 析构函数的实现,通常为空
    5. }
    6. };

    4.派生类中的析构函数

    • 派生类应该按需要实现其自己的析构函数,不需要添加 virtual 关键字,因为它继承了基类的虚析构函数。
    1. class Derived : public Base {
    2. public:
    3. ~Derived() {
    4. // 派生类析构函数的实现,释放派生类特有的资源
    5. }
    6. };

    5.使用虚析构函数

    • 使用基类指针(或引用)来管理派生类对象,并确保通过基类指针删除对象。
    1. Base* basePtr = new Derived();
    2. delete basePtr; // 正确释放资源,调用派生类析构函数

    注意,如果不使用虚析构函数,上述代码将只调用基类的析构函数,可能导致派生类资源泄漏。

    1. class Animal {
    2. public:
    3.   virtual ~Animal() {
    4.     cout << "⽗类的析构函数执⾏了" << endl;
    5.  }
    6. };
    7. class Person: public Animal {
    8. public:
    9.   int* n;
    10.   Person() {
    11.     n = new int(10);
    12.  }
    13.   ~Person() override { 
    14. cout << "⼦类的析构函数执⾏了" << endl;
    15.     if (n != nullptr) {
    16.       delete n;
    17.       n = nullptr;
    18.    }
    19.  }
    20. };
    21. int main() {
    22.   Animal* animal = new Person();
    23.   // 如果没有虚析构函数的话,这⾥通过animal来销毁空间,的确可以把Person开辟的堆空间给销毁掉
    24.   // 但是,由于只会触发⽗类中的析构函数,因此⽆法将Person属性n开辟的堆空间给销毁掉,造成内存泄漏
    25.   // 解决⽅案:将⽗类的析构函数作为虚析构函数,完成动态绑定
    26.   delete animal;
    27.   return 0;
    28. }

     

  • 相关阅读:
    C语言回调函数到底是怎么回事?
    【需要打开多少监视器】Python 实现
    猿创征文|详解从0开始的嵌入式学习路线,学什么、怎么学?
    【案例】| C++实现STMP发送邮件
    【仿美团点餐App】—— 首页(一)
    Liunx两台服务器实现相互SSH免密登录
    机器学习实战:基于sklearn的工业蒸汽量预测
    面试问题总结(1)
    吃透BGP,永远绕不开这些基础概述,看完再也不怕BGP了!
    数字人直播软件排名推荐,铭顺科技数字人品牌抢占“日不落”流量新技能
  • 原文地址:https://blog.csdn.net/weixin_63779802/article/details/132912746
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号