正确地使用智能指针
2016-06-23 13:09
218 查看
C++没有像Java和C#那样存在自动内存回收机制,因此C++的内存管理是每一个C++程序员都要面对的问题。所幸的是,C++提供了智能指针这一机制来帮助我们自动地管理内存分配,大大方便了内存管理。
C++提供了两种智能指针:auto_ptr和shared_ptr,这两种类型都具备自动管理内存资源的功能。当智能指针离开作用域的时候,其指向的内存区块会被自动销毁,防止内存泄漏问题。
对于auto_ptr,注意一定不要让多个auto_ptr同时指向同一对象!它有一个不寻常的性质:若通过copy构造函数或copy assignment操作符复制它们,它们会变成null,而复制所得的指针将取得资源的唯一拥有权!
这种赋值方式明显是很不自然的,因此我们可以通过shared_ptr来管理指针。多个shared_ptr对象可以指向同一个指针,当最后一个指向该指针的shared_ptr对象不再指向它之后,该区域内存就会被自动销毁。
需要注意的是,无论是auto_str还是shared_str,其销毁内存的函数都是delete而不是delete[]。也就是说,如下用法会导致内存泄露:
但这样是可以通过编译的,因此这是使用智能指针需要注意的一点。
C++提供了两种智能指针:auto_ptr和shared_ptr,这两种类型都具备自动管理内存资源的功能。当智能指针离开作用域的时候,其指向的内存区块会被自动销毁,防止内存泄漏问题。
对于auto_ptr,注意一定不要让多个auto_ptr同时指向同一对象!它有一个不寻常的性质:若通过copy构造函数或copy assignment操作符复制它们,它们会变成null,而复制所得的指针将取得资源的唯一拥有权!
#include <iostream> #include <memory> int main() { int* x=new int; std::auto_ptr<int> sp(x);//now sp points to x std::auto_ptr<int> sp2=sp;//now sp2 points to x,sp is null return 0; }
这种赋值方式明显是很不自然的,因此我们可以通过shared_ptr来管理指针。多个shared_ptr对象可以指向同一个指针,当最后一个指向该指针的shared_ptr对象不再指向它之后,该区域内存就会被自动销毁。
#include <iostream> #include <memory> int main() { int* x=new int; std::tr1::shared_ptr<int> sp(x);//now sp points to x std::tr1::shared_ptr<int> sp2=sp;//now sp2 points to x,sp as well return 0; }
需要注意的是,无论是auto_str还是shared_str,其销毁内存的函数都是delete而不是delete[]。也就是说,如下用法会导致内存泄露:
std::tr1::shared_ptr<int> sp(new int[5]);
但这样是可以通过编译的,因此这是使用智能指针需要注意的一点。
相关文章推荐
- 文件-第12章-《数据结构题集》习题解析-严蔚敏吴伟民版
- AIX7.1_oralce11gR2的ADG安装文档
- 使用SHELL脚本取今天的剩余时间
- java实现简单的单点登录
- CentOS 6.5下编译安装MySQL 5.6. 系列
- 源码推荐(0623):最简洁的购物车通用模板,咸鱼APP-视频动画版新特性
- Nexpose 注册和安装的问题
- spi协议->裸机程序->master驱动程序分析
- 飛飛(八十一)(补)阅读程序
- 我的签到
- noi1789 算24 解题报告
- html<map>使用例子记录
- [转载]javascript创建对象的几种方式
- 人月神话阅读笔记03
- 幻方之幻
- 8、xen虚拟机双网卡配置
- windows下安装redis
- 解决haproxy代理nginx获取客户端真实ip问题
- Linux mint cinnamon 64bit 17.3 使用体验
- 个人总结