56_01 C++ 多态 解决父类指针释放子类对象时,子类指针不能完全释放导致的,内存泄露

通过父类指针去释放,会导致子类对象可能清理不干净,造成内存泄漏
怎么解决?给基类增加一个虚析构函数
虚析构函数就是用来解决通过父类指针释放子类对象 

多态如果使用引用方法即可避免上述问题!

#include"inherit_09.h"

class AnimalC
{
public:
	AnimalC()
	{
		cout << "call AnimalC" << endl;
	}
	// 方法1:虚构函数
	//virtual ~AnimalC()
	//{
	//	cout << "call ~AnimalC(虚析构函数)" << endl;
	//}

	// 方法2 纯虚析构函数,!!! 除了声明外还需要在外部写函数体 !!!!!
	// 和包含普通纯虚函数的类一样,包含了纯虚析构函数的类也是一个抽象类。不能够被实例化
	virtual ~AnimalC() = 0;
	virtual void spead() = 0;
	
};

AnimalC::~AnimalC()
{
	cout << "call ~AnimalC(纯虚析构函数)" << endl;
}

class CatC:public AnimalC
{
public:
	CatC(string name)
	{
		// 开辟堆空间
		this->name = new string(name);
		cout << "call CatC" << endl;
	}
	~CatC()
	{
		cout << "call ~CatC" << endl;
		if (this->name != NULL)
		{
			delete this->name;
			this->name = NULL;
		}
	}
	virtual void spead()
	{
		cout << *name << "小猫在说话!" << endl;
	}
	string* name;
};

// 动画在说话(实现多态)
void animal_spead(AnimalC& obj)
{
	obj.spead();
}


//引用方法 引用方法不会有指针方法导致子类对象可能清理不干净的情况
//call AnimalC
//call CatC
//TOM小猫在说话!
//call ~CatC
//call ~AnimalC
void inherit_09_reference()
{
	cout << "引用方法" << endl;
	CatC cat("TOM");
	animal_spead(cat);
}

//指针方法 (缺少调用子类的析构函数)
//call AnimalC
//call CatC
//Tom小猫在说话!
//call ~AnimalC
void inherit_09_pointer()
{
	cout << "\n指针方法" << endl;
	AnimalC* cat = new CatC("Tom");
	cat->spead();
	// 通过父类指针去释放,会导致子类对象可能清理不干净,造成内存泄漏
	// 在父类增加虚构函数即可
	delete cat;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值