容器存放指针的技巧-自动管理内存

一:前提

我们知道,容器直接存放对象往往会降低性能,我们可以选择存放对象的指针,但是存放普通的指针将会带来内存管理的问题,即我们需要手动释放内存。下面介绍两种方法,详细介绍如何巧妙存放指针同时自动管理内存。

二:方法

2.1 使用智能指针shared_ptr,容器存放shared_ptr智能指针,让智能指针管理内存。

2.2 使用代理类,代理类的应用很广泛,它可以使容器包含不同类型的对象(详看C++沉思录第五章),这里可以用代理类存放对象的指针,利用代理类析构函数删除指针指向的内容,从而实现自动管理内存,这种方法虽然也是存放对象,但是代理类很简单,构造起来性能也高。

三:代码

/**想创建一个包含Vehicle指针的vector同时
	又不想承担内存管理的责任,方法有两种:
	1:使用内存指针
	2:使用代理类
*/
#include <iostream>
#include <unistd.h>
#include <vector>
#include <memory>
using namespace std;
class Vehicle{
public :
	Vehicle(){
	}
	~Vehicle(){}
	Vehicle* copy() const{
		return new Vehicle(*this);
	}
};
class VehicleSurrogate
{
public:
	VehicleSurrogate():vp(0){}
	VehicleSurrogate(const Vehicle& v):vp(v.copy()){}
	~VehicleSurrogate(){
		delete vp;/*析构函数,释放Vehicle指针指向的内存*/
	}
	VehicleSurrogate(const VehicleSurrogate& v):vp(v.vp?v.vp->copy():0){}
	VehicleSurrogate& operator=(const VehicleSurrogate& v)
	{
		if(this != &v){
			delete vp;
			vp=(v.vp?v.vp->copy():0);
		}
		return *this;
	}
private:
	Vehicle* vp;
	
};
int main()
{
	
	std::vector<shared_ptr<Vehicle> > vSharePtr;
	std::vector<VehicleSurrogate> vVehicleSurrogate;
	for(int i=0;i<5;++i)
	{
		shared_ptr<Vehicle> sp(new Vehicle()); 
		vSharePtr.push_back(sp);
	}
	for(int i=0;i<5;++i)
	{
		Vehicle v;
		VehicleSurrogate vs=v;
		vVehicleSurrogate.push_back(vs);
	}
	cout<<"size of vSharePtr:"<<vSharePtr.size()<<endl;
	cout<<"size of vVehicleSurrogate:"<<vVehicleSurrogate.size()<<endl;
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值