Effective C++ 条款14: 确定基类有虚析构函数

#include <iostream>

using namespace std;

class BaseA
{
public:
	BaseA(){cout <<"BaseA::BaseA()" <<endl;}
	~BaseA(){cout <<"BaseA::~BaseA()" <<endl;}
};

class DevA : public BaseA
{
public:
	DevA(){ p = new char[10];cout <<"DevA::DevA()" <<endl;}
	~DevA(){ delete[] p;cout <<"DevA::~DevA()" <<endl;}
private:
       char *p;
};

int main(){BaseA *a = new DevA();delete a;return 0;}

在上面的例子中它不会调用DevA类中的析构函数,其实这种情况先有肯发生能出泄露。假设我DevA像下列声明:

class DevA : public BaseA
{
public:
	DevA(){p = new char[10]; cout <<"DevA::DevA()" <<endl;}
	~DevA(){delete[] p;  cout <<"DevA::~DevA()" <<endl;}                                                                                              private:                                                                                                                                                          char *p;
};
那么指针p的内存将得不到回收。为什么p的内存没有被回收,因为程序没有调用DevA的析构函数所以碰到这种问题我们只需将

BaseA的析构函数声明为virtual就行,这样在delete a时他会被动态绑定调用DevA的析构函数。当然不是所有类的析构函数都要virtual

所以基本的一条是,无故的声明虚析构函数和永远不去声明一样是错误的。实际上,很多人这样总结:当且仅当类里包含至少一个虚函数的时候才去声明虚析构函数。

当然上述方法不是一条定理,能适用于所有的地方,本文的第二个例子就不适用。








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值