拓冰建站拓冰建站
首页 / 资讯中心 / 正文

1.12 C++踩坑排雷手册——基类析构函数非 virtual 导致资源泄漏:派生类析构不被调用

1.12 C++实战100例——基类析构函数非virtual导致资源泄漏:派生类析构不被调用受众中级工程师,已掌握继承、多态和虚函数的基本概念,能区分栈对象和堆对象的生命周期管理。默认具备基础 Linux 操作能力和 Valgrind 内存检测能力。场景锚定场景:你的 C++ 程序通过基类指针(Base*)指向派生类对象(new Derived()),然后调用delete ptr释放对象。Valgrind 报告内存泄漏,派生类中分配的资源(如堆内存、文件句柄、锁)未被释放。你检查了代码,确信派生类析构函数中正确地释放了所有资源。在栈上创建派生类对象(Derived d;)时析构正常,但堆上通过基类指针删除时派生类析构未被调用。这篇文章给你一条编译命令、一条 Valgrind 检测命令和一条 GDB 断点观察命令,直接看穿非虚析构函数导致的派生类析构跳过现象。摘要当通过基类指针删除派生类对象时,如果基类的析构函数不是virtual,C++ 标准规定行为是未定义行为。在实践中,大多数实现表现为:只调用基类析构函数,派生类析构函数完全不被调用。其物理原因是析构函数的调用决议基于静态类型而非动态类型——delete ptr中的ptr类型是Base*,编译
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门