讲师中心 微信公众号
AI工具推荐 视频效率加速

C++的虚析构函数有什么用_防止C++多态基类指针内存泄漏的关键

轻宇大大_4918

轻宇大大_4918

发布时间:2025-12-08 21:58:03

|

191人浏览过

|

来源于php中文网

原创

虚析构函数确保派生类析构函数被正确调用,防止资源泄漏;若基类析构函数非虚,通过基类指针删除派生类对象时仅调用基类析构函数,导致派生类资源未释放。

c++的虚析构函数有什么用_防止c++多态基类指针内存泄漏的关键

在C++中,当使用多态(即通过基类指针操作派生类对象)时,如果基类没有将析构函数声明为虚函数,可能会导致内存泄漏或资源未正确释放。这就是为什么虚析构函数如此关键的原因。

为什么需要虚析构函数

当通过基类指针删除一个派生类对象时,如果基类的析构函数不是虚函数,那么只有基类的析构函数会被调用,而派生类的析构函数不会执行。这会导致派生类中分配的资源(如动态内存、文件句柄等)无法被释放,从而造成内存泄漏。

举个例子:

class Base {
public:
    ~Base() { 
        // 只有这个析构函数被调用
        std::cout << "Base destroyed\n"; 
    }
};
<p>class Derived : public Base {
int* data;
public:
Derived() { data = new int[100]; }
~Derived() { 
delete[] data;  // 这个不会被调用!
std::cout << "Derived destroyed\n"; 
}
};</p>

立即学习C++免费学习笔记(深入)”;

C++ 算法竞赛自动化测试数据生成与校验框架
C++ 算法竞赛自动化测试数据生成与校验框架

根据原题生成新题面、验证器及完整测试数据,自动套用 testlib 模板,用于用户要求生成测试数据时。

下载
Base* ptr = new Derived();
delete ptr;  // 仅调用 Base::~Base()

此时,Derived 的析构函数不会被调用,data 指针所指向的内存永远不会被释放,造成内存泄漏。

解决方法:声明虚析构函数

只需将基类的析构函数声明为 virtual,即可确保删除基类指针时,从派生类到基类的整个析构链都被正确调用。

立即学习C++免费学习笔记(深入)”;

class Base {
public:
    virtual ~Base() { 
        std::cout << "Base destroyed\n"; 
    }
};
<p>class Derived : public Base {
int* data;
public:
Derived() { data = new int[100]; }
~Derived() { 
delete[] data;
std::cout << "Derived destroyed\n"; 
}
};</p>

立即学习C++免费学习笔记(深入)”;

Base* ptr = new Derived();
delete ptr;  // 先调用 Derived::~Derived(),再调用 Base::~Base()

现在,delete 操作会触发虚函数机制,正确调用派生类的析构函数,资源得以安全释放。

什么情况下必须加虚析构函数

如果你设计的类满足以下任一条件,就应该把析构函数设为虚函数:

  • 类中定义了虚函数(意味着该类用于多态)
  • 类可能被其他类继承,并且你预期用户会通过基类指针删除派生类对象

即使析构函数本身不需要做任何事,也应声明为虚函数以防止潜在的资源泄漏。

性能与注意事项

虚析构函数会为类引入虚表指针(vptr),每个对象会多占用一个指针大小的空间。对于非常轻量的类,这可能是开销。但只要涉及多态,这点开销远小于内存泄漏带来的风险。

另外,不要忘记:如果基类有虚析构函数,派生类的析构函数自动成为虚函数(即使不显式写 virtual),这是C++的标准行为。

基本上就这些。只要你在多态场景下使用继承,记得给基类加上 virtual ~Base(),就能有效防止内存泄漏问题。不复杂但容易忽略。

热门AI工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

LibLibAI
LibLibAI Hot

一款AI视频创作工具,主要用于国内领先的AI创意平台,以海量模型、低门槛操作与“创作-分享-商业化”生态,让小白与专业创作者都能高效实现图文乃至视频创意表达,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

相关专题

更多
java多态详细介绍
java多态详细介绍

本专题整合了java多态相关内容,阅读专题下面的文章了解更多详细内容。

295

2025.11.27

C++ 智能指针与现代内存管理
C++ 智能指针与现代内存管理

深入讲解 C++ 现代内存管理的核心工具——智能指针,涵盖 unique_ptr 独占所有权语义、shared_ptr 引用计数机制与循环引用问题、weak_ptr 弱引用的应用场景、make_unique/make_shared 工厂函数的性能优势、自定义删除器的编写、RAII 资源管理思想的实践,以及从裸指针迁移到智能指针的重构策略,帮助开发者编写安全无泄漏的现代 C++ 代码。

299

2026.04.23

数据库Delete用法
数据库Delete用法

数据库Delete用法:1、删除单条记录;2、删除多条记录;3、删除所有记录;4、删除特定条件的记录。更多关于数据库Delete的内容,大家可以访问下面的文章。

2391

2023.11.13

drop和delete的区别
drop和delete的区别

drop和delete的区别:1、功能与用途;2、操作对象;3、可逆性;4、空间释放;5、执行速度与效率;6、与其他命令的交互;7、影响的持久性;8、语法和执行;9、触发器与约束;10、事务处理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

745

2023.12.29

NumPy性能优化版本更新与常见报错排查
NumPy性能优化版本更新与常见报错排查

本专题整理 NumPy 性能优化、版本更新与常见报错排查相关教程,覆盖向量化计算、广播性能、内存布局、NumPy 2.0 升级、版本兼容冲突、安装导入报错、dtype 溢出、矩阵运算异常和 broadcasting 报错修复,帮助读者系统掌握 NumPy 性能调优与问题定位方法。

0

2026.09.22

Vibeknow在线使用入口合集
Vibeknow在线使用入口合集

本专题汇总了Vibeknow在线创作视频的官方入口及网页版使用教程,涵盖PPT、PDF、Word等文档一键转讲解视频的核心操作,并整理了免费版水印规则与手机端浏览器访问指南,助你快速将知识内容视频化。

20

2026.09.21

NumPy随机数文件读写与dtype数据类型
NumPy随机数文件读写与dtype数据类型

本专题整理 NumPy 随机数、文件读写与 dtype 数据类型相关教程,覆盖 Generator/random、随机数种子、正态分布采样、npy/npz/CSV/TXT 保存读取、loadtxt/savetxt、memmap、大文件处理、astype 类型转换、结构化 dtype、整数溢出和精度丢失等场景。

20

2026.09.21

NumPy矩阵运算与线性代数计算
NumPy矩阵运算与线性代数计算

本专题整理 NumPy 矩阵运算与线性代数计算相关教程,覆盖矩阵乘法、dot 与 @ 运算符、逆矩阵、行列式、特征值与特征向量、SVD、线性方程组、欧氏距离、矩阵分解和大规模矩阵性能优化等内容,帮助读者掌握 np.linalg 与矩阵计算实战。

0

2026.09.21

NumPy广播机制数学运算与统计分析
NumPy广播机制数学运算与统计分析

本专题整理 NumPy 广播机制、数组数学运算与统计分析相关教程,覆盖广播规则、维度对齐、矩阵与数组加减除法、向量化计算、均值方差、分位数、中位数、直方图和 unique 频次统计等场景,帮助读者掌握 ndarray 高效计算与统计处理方法。

0

2026.09.21

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Conan 2 Essentials 免费课程
Conan 2 Essentials 免费课程

共0课时 | 0人学习

CMake 与 Conan 集成实践
CMake 与 Conan 集成实践

共0课时 | 0人学习

Conan 2 高级依赖模型介绍
Conan 2 高级依赖模型介绍

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn