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