C++中基类的析构函数为什么要用virtual虚析构函数

文章讲述了C++中基类采用virtual虚析构函数的必要性,防止因静态绑定导致的内存泄漏问题,以及派生类析构函数的执行顺序。强调了虚函数在多态和内存管理中的关键作用。

直接的讲,C++中基类采用virtual虚析构函数是为了防止内存泄漏。具体地说,如果派生类中申请了堆内存空间,并在其析构函数中对这些内存空间进行释放。假设基类中采用的是非虚析构函数,当删除基类指针指向的派生类对象时就不会触发动态绑定,因而只会调用基类的析构函数,而不会调用派生类的析构函数。那么在这种情况下,派生类中申请的空间就得不到释放从而产生内存泄漏。所以,为了防止这种情况的发生,C++中基类的析构函数应采用virtual虚析构函数。

代码演示

现有Base基类,其析构函数为非虚析构函数。Derived1和Derived2为Base的派生类,这两个派生类中均有以string* 指向存储其name的地址空间,name对象是通过new创建在堆上的对象,因此在析构时,需要显式调用delete删除指针归还内存,否则就会造成内存泄漏。
基类:

#include <iostream>
#include <string>
using namespace std;
class Base {
   
   
 public:
	Base():age_(new int(18)) {
   
   
	  cout << "Base()" << endl;
	}
	~Base(){
   
   
	  delete age_;
	  cout << "~Base()" << endl;
	}
	void showAge(){
   
    cout <<"Base::age_==" << *age_ << endl;};
	virtual void showName()=0;
private:
	int
C++中,当使用基类指针指向派生类对象时,如果基类析构函数不是虚函数,在删除基类指针时,只会调用基类析构函数,而不会调用派生类的析构函数,这可能会导致派生类对象的资源无法正确释放,从而造成内存泄漏。 #### 原理 当基类析构函数被声明为`virtual`时,会在类的对象中创建一个虚函数表(vtable),这个表中存储了虚函数的地址。当通过基类指针删除对象时,程序会根据对象的实际类型(而不是指针的类型)来查找虚函数表,从而调用正确的析构函数。也就是说,即使使用基类指针指向派生类对象,也会调用派生类的析构函数,然后再调用基类析构函数,确保所有资源都被正确释放。 以下是一个示例代码: ```cpp #include <iostream> // 基类 class Base { public: Base() { std::cout << "Base constructor" << std::endl; } virtual ~Base() { std::cout << "Base destructor" << std::endl; } // 虚析构函数 }; // 派生类 class Derived : public Base { public: Derived() { std::cout << "Derived constructor" << std::endl; } ~Derived() { std::cout << "Derived destructor" << std::endl; } }; int main() { Base* basePtr = new Derived(); delete basePtr; // 调用派生类的析构函数,然后调用基类析构函数 return 0; } ``` 在上述代码中,由于基类析构函数是虚函数,当`delete basePtr`时,会先调用`Derived`类的析构函数,再调用`Base`类的析构函数,确保派生类的资源被正确释放。 #### 优势 - **避免内存泄漏**:确保派生类对象的所有资源(如动态分配的内存、文件句柄等)都能被正确释放,防止因部分析构而导致的内存泄漏问题。 - **提高代码的可维护性和安全性**:使得代码在处理多态对象时更加安全可靠,减少了因忘记释放资源而导致的潜在错误。即使在代码后续扩展或修改时,也能保证资源的正确管理。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值