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

c++中virtual析构函数的作用_c++虚析构函数原理【详解】

冬枫姑娘_4282

冬枫姑娘_4282

发布时间:2026-01-28 12:48:57

|

224人浏览过

|

来源于php中文网

原创

因为基类析构函数非virtual时delete会静态绑定只调用基类析构,导致派生类析构被跳过;加virtual后通过vtable动态绑定,先调派生类再自动链式调基类析构。

c++中virtual析构函数的作用_c++虚析构函数原理【详解】

为什么 delete 基类指针会漏掉派生类析构?

因为 C++ 默认用静态绑定:编译期就决定调用哪个析构函数。如果 Base* 指向 Derived 对象,而 Base::~Base() 不是 virtual,那 delete ptr; 就只调 Base::~Base(),Derived::~Derived() 根本不执行——哪怕它里面 delete 了堆内存、关了文件句柄、解了锁,全被跳过。

虚析构函数怎么让 delete 正确工作?

加 virtual 后,编译器会给类加虚函数表(vtable),其中存着该类型真正的析构函数地址。运行时通过指针的动态类型查表,先调 Derived::~Derived(),再自动链式调 Base::~Base()(这是编译器保证的,不用手动写 Base::~Base() 调用)。

  • 只要基类有虚函数(哪怕只有 virtual ~Base() = default;),就必须把析构函数也设为 virtual
  • 抽象基类常用纯虚析构:virtual ~Base() = 0;,但必须在类外定义:Base::~Base() {},否则链接失败——因为派生类析构里隐式调用了它
  • 没继承需求的类(比如 std::string 这种工具类),别乱加 virtual 析构,徒增虚表开销和 ABI 复杂度

常见错误写法与后果

下面这些看着像对,其实埋雷:

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
  • class Base { ~Base(); }; —— 没 virtual,多态删除直接资源泄漏
  • class Base { virtual ~Base() = 0; }; 但没在 .cpp 里写 Base::~Base() {} —— 链接时报 undefined reference to 'Base::~Base()'
  • class Base { virtual ~Base() {} }; + class Derived : public Base { ~Derived() override; }; 却忘了在 Derived::~Derived() 里显式释放自己的资源 —— 虚析构只是启动了调用链,不替你写逻辑

inline 虚析构有用吗?

可以加 inline virtual ~Base() = default;,编译器可能内联最顶层的调用,但注意:虚函数表条目仍存在,动态绑定机制照常;真正省的是“调用指令跳转”开销,不是虚机制本身。对性能敏感场景有意义,但别指望靠它消除虚表。

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

纯虚析构必须定义,不是语法刁难,而是 C++ 规定析构函数调用链必须完整可达——哪怕抽象类从不实例化,它的析构函数仍是派生类析构过程中的一个真实环节。

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

讯飞绘文

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

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

AionClaw
AionClaw Hot

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

WorkBuddy

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

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

DeepSeek

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

豆包大模型

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

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

6679

2023.08.02

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

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

355

2025.11.27

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

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

379

2026.04.23

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

6147

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2588

2023.08.10

class在c语言中的意思
class在c语言中的意思

在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

4116

2024.01.03

python中class的含义
python中class的含义

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

306

2025.12.06

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

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

3171

2023.11.13

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

80

2026.10.22

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Gradle 安全最佳实践
Gradle 安全最佳实践

共0课时 | 0人学习

Gradle Wrapper 使用与安全指南
Gradle Wrapper 使用与安全指南

共0课时 | 0人学习

Golangci-lint命令行使用演示
Golangci-lint命令行使用演示

共0课时 | 0人学习

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

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