当前位置: 首页 > news >正文

C++中析构函数不设为virtual导致内存泄漏示例

一、问题示例

#include <iostream>
using namespace std;class Base {
public:Base() { cout << "Base constructor\n"; }~Base() { cout << "Base destructor\n"; } // 不是 virtual
};class Derived : public Base {
public:Derived() { cout << "Derived constructor\n"; }~Derived() { cout << "Derived destructor\n"; }
};int main() {Base* ptr = new Derived();  // 用 Base 指针指向 Derived 对象delete ptr;                 // 只调用 Base 的析构函数return 0;
}

二、输出结果

在这里插入图片描述
注意:没有调用 Derived 的析构函数

三、问题解释

为什么会这样?

  • Base 的析构函数不是 virtual

  • 当你执行 delete ptr,编译器只看 ptr 的静态类型(即 Base*),它就只调用 ~Base()

  • 因此,不会调用 Derived 的析构函数,可能会导致:

    • Derived 析构中释放的资源没有释放(内存泄漏);
    • 或者 Derived 析构中有清理逻辑没执行(行为错误);

四、修复方法

Base 的析构函数设为 virtual

class Base {
public:virtual ~Base() { cout << "Base destructor\n"; }  // virtual 析构
};

正确输出:

在这里插入图片描述


五、图示原理(简化)

如果你用 virtual

Base vtable:
+----------------+
|  &Base::~Base  |  ← 原始虚函数地址
+----------------+Derived vtable:
+--------------------+
| &Derived::~Derived | ← 覆盖虚析构函数
+--------------------+delete ptr 会通过 vtable 跳转到 Derived::~Derived → 再调用 Base::~Base

六、总结

是否 virtualdelete 派生类指针时行为是否内存泄漏
只调用基类析构函数有可能
调用派生 → 再基类析构安全

七、经验建议

只要类中有虚函数(即打算支持多态)或你“可能”通过基类指针删除派生类对象,就应该将析构函数声明为 virtual

最好这样写:

class Base {
public:virtual ~Base() = default;
};
http://www.dtcms.com/a/196118.html

相关文章:

  • 使用glsl 来做视频矫正
  • 单细胞转录组(2)单细胞测序原理
  • 【Linux网络与网络编程】12.NAT技术内网穿透代理服务
  • 【前端基础】HTML元素隐藏的四个方法(display设置为none、visibikity设置为hidden、rgba设置颜色、opacity设置透明度)
  • DeepSeek 赋能社会科学:解锁研究新范式
  • 现在市面上三大常用的拓客软件好用吗?
  • 机器学习,深度学习,神经网络,深度神经网络之间有何区别?
  • PostgreSQL内幕剖析——结构与架构
  • C++类与对象--1 特性一:封装
  • 深入浅出IIC协议 - 从总线原理到FPGA实战开发 -- 第一篇:I2C总线协议深度解剖
  • CentOS 下 FTP 与 NFS 服务深度解析:从基础配置到实战应用
  • 深度学习推理引擎---OpenVINO
  • Android核心系统服务:AMS、WMS、PMS 与 system_server 进程解析
  • 如何在纷杂的环境当中保持保持独立思考能力?
  • linux c++头文件生成源文件 使用python脚本 配置vim快捷键
  • Unity3D仿星露谷物语开发44之收集农作物
  • OAuth2.0
  • 6to4、6over4的类比解释
  • 使用tensorRT10部署低光照补偿模型
  • MySQL相关
  • [强化学习的数学原理—赵世钰老师]学习笔记02-贝尔曼方程
  • 支持selenium的chrome driver更新到136.0.7103.94
  • 【2025年软考中级】第一章1.6 安全性、可靠性、性能评价
  • Python爬虫实战:获取1688商品信息
  • 无需配置光猫,使用网管交换机配合路由器的IPTV功能实现单线复用
  • Uniapp开发鸿蒙应用时如何运行和调试项目
  • Kotlin与机器学习实战:Android端集成TensorFlow Lite全指南
  • 从神经架构到万物自动化的 AI 革命:解码深度学习驱动的智能自动化新范式
  • 人工智能100问☞第25问:什么是循环神经网络(RNN)?
  • 基于OpenCV的SIFT特征和FLANN匹配器的指纹认证