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

来源:互联网 发布:旅游景点数据库 编辑:程序博客网 时间:2024/05/24 06:21

一:前提

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

二:方法

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;}


0 0
原创粉丝点击