C++中基类为何要将析构函数声明为虚,以避免派生类对象在基类析构函数未虚时引发内存泄漏的尴尬局面?
- 内容介绍
- 文章标签
- 相关推荐
为什么基类析构函数必须是虚函数?
在 C++ 的多态编程中,最常见的痛点之一就是:通过基类指针删除派生类对象时出现内存泄漏或未定义行为。这往往让人头疼,特别是在大型项目里一个小小的失误就可能导致整个程序崩溃。
1️⃣ 何为析构函数?
析构函数是一个特殊的成员函数,用于在对象生命周期结束时释放资源。它的名字前面带有波浪号,如 ~Base。与构造函数不同,析构函数可以被声明为虚函数这正是实现多态销毁的关键。
2️⃣ 何谓“虚”析构函数?
virtual ~Base;
当基类中的析构函数被声明为 virtual 时C++ 会为该类生成一个虚表,并在对象内部插入一个指向该表的指针。这样,当使用基类指针或引用删除对象时编译器会根据实际对象类型动态决定调用哪个析构函数。
3️⃣ 非虚析构 + 多态 = 内存泄漏
场景:
#include
#include
class Base {
说到public。 为什么基类析构函数必须是虚函数?
在 C++ 的多态编程中,最常见的痛点之一就是:通过基类指针删除派生类对象时出现内存泄漏或未定义行为。这往往让人头疼,特别是在大型项目里一个小小的失误就可能导致整个程序崩溃。
1️⃣ 何为析构函数?
析构函数是一个特殊的成员函数,用于在对象生命周期结束时释放资源。它的名字前面带有波浪号,如 ~Base。与构造函数不同,析构函数可以被声明为虚函数这正是实现多态销毁的关键。
2️⃣ 何谓“虚”析构函数?
virtual ~Base;
当基类中的析构函数被声明为 virtual 时C++ 会为该类生成一个虚表,并在对象内部插入一个指向该表的指针。这样,当使用基类指针或引用删除对象时编译器会根据实际对象类型动态决定调用哪个析构函数。
3️⃣ 非虚析构 + 多态 = 内存泄漏
场景:
#include
#include
class Base {
说到public。 
