容器存放指针的技巧-自动管理内存
来源:互联网 发布:旅游景点数据库 编辑:程序博客网 时间: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
- 容器存放指针的技巧-自动管理内存
- 容器存放指针造成的内存泄露问题
- 容器存放string指针
- 内存管理——数据存放位置和野指针
- 容器类的内存管理
- 共享内存能否存放带有指针的结构体?
- 自动释放内存的指针
- STL容器里存放对象还是指针
- STL容器里存放对象还是指针
- STL容器里存放对象还是指针
- STL容器里存放对象还是指针?
- STL容器里存放对象还是指针
- STL容器里存放对象还是指针
- 容器存放基础类型、对象、指针
- 用智能指针管理容器及内存紧凑
- JAVA内存管理的技巧
- 内存管理的小技巧
- Java内存管理的技巧
- C++函数名的修饰规则
- 地铁译:Spark for python developers ---Spark的数据戏法
- js处理金额
- spring mvc controller间跳转 重定向 传参
- C++静态库基本编程
- 容器存放指针的技巧-自动管理内存
- uva 784 Maze Exploration(迷宫探索) —— DFS
- ERROR StatusLogger No log4j2 configuration file found.的解决方法
- 批量杀死进程
- C#网络程序设计1-4:多线程并发执行
- 使用eclipse搭建android开发环境
- 九度 OJ 1020:最小长方形
- Light oj 1414 - February 29【容斥原理】
- Firefox成为渗透测试工具的18个插件