公司动态

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

📅 2026/8/26 15:38:20
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*,编译