推荐cpp的shared_ptr和auto_ptr的文章
来源:互联网 发布:mac腾讯微云同步盘 编辑:程序博客网 时间:2024/06/04 21:59
cpp的shared_ptr和auto_ptr的文章
http://blog.csdn.net/u013696062/article/details/39665247
http://blog.csdn.net/u013696062/article/details/39477571
auto_ptr
http://www.cnblogs.com/qytan36/archive/2010/06/28/1766555.html
auto_ptr是C++标准库中()为了解决资源泄漏的问题提供的一个智能指针类模板
(注意:这只是一种简单的智能指针)
auto_ptr的实现原理其实就是RAII,在构造的时候获取资源,在析构的时候释放资源,
并进行相关指针操作的重载,使用起来就像普通的指针。
std::auto_ptr pa(new ClassA);
下面主要分析一下auto_ptr的几个要注意的地方:
1,Transfer of Ownership
auto_ptr与boost库中的share_ptr不同的,auto_ptr没有考虑引用计数,因此一个对象只能由一个auto_ptr所拥有,
在给其他auto_ptr赋值的时候,会转移这种拥有关系。
#include <utility>#include <iostream>using namespace std;class A{public: A() { id = ++count; cout << "create A" << id << "\n"; } ~A() { cout << "destroy A" << id << "\n"; }private: static int count; int id;};int A::count = 0;/*调用该函数会丢失掉所有权*/void sink(auto_ptr<A> a){ cout << "Enter sink()\n";}/*调用该函数会创建对象,并获取所有权*/auto_ptr<A> create(){ cout << "Enter create()\n"; auto_ptr<A> a(new A()); return a;}int main(int argc, char *argv[]){ auto_ptr<A> a1 = create(); auto_ptr<A> a2 = a1; /*转移所有权,此时a1无效了*/ auto_ptr<A> a3(new A()); cout << "Exit create()\n"; sink(a2);/*丢失所有权,会发现a2的释放在sink函数中进行*/ cout << "Exit sink()\n"; return 0;}
输出结果是:
Enter create()create A1create A2Exit create()Enter sink()destroy A1Exit sink()destroy A2
2,从上可知由于在赋值,参数传递的时候会转移所有权,因此不要轻易进行此类操作。
比如:std::auto_ptr pa(new ClassA());
bad_print(pa); //丢失了所有权
pa->…; //Error
3,使用auto_ptr作为成员变量,以避免资源泄漏。
为了防止资源泄漏,我们通常在构造函数中申请,析构函数中释放,但是只有构造函数调用成功,析构函数才会被调用,换句话说,如果在构造函数中产生了异常,那么析构函数将不会调用,这样就会造成资源泄漏的隐患。
比如,如果该类有2个成员变量,指向两个资源,在构造函数中申请资源A成功,但申请资源B失败,则构造函数失败,那么析构函数不会被调用,那么资源A则泄漏。
为了解决这个问题,我们可以利用auto_ptr取代普通指针作为成员变量,这样首先调用成功的成员变量的构造函数肯定会调用其析构函数,那么就可以避免资源泄漏问题。
4,不要误用auto_ptr
1)auto_ptr不能共享所有权,即不要让两个auto_ptr指向同一个对象。
2)auto_ptr不能指向数组,因为auto_ptr在析构的时候只是调用delete,而数组应该要调用delete[]。
3)auto_ptr只是一种简单的智能指针,如有特殊需求,需要使用其他智能指针,比如share_ptr。
4)auto_ptr不能作为容器对象,STL容器中的元素经常要支持拷贝,赋值等操作,在这过程中auto_ptr会传递所有权,那么source与sink元素之间就不等价了。
- 推荐cpp的shared_ptr和auto_ptr的文章
- std::auto_ptr和tr1::shared_ptr的用法
- auto_ptr与shared_ptr 的区别
- 智能指针scoped_ptr,shared_ptr,weak_ptr和auto_ptr的使用
- C++中 auto_ptr和tr1::shared_ptr的区别
- 条款13:关于文中多次提及的auto_ptr和shared_ptr
- auto_ptr 和 tr1::shared_ptr
- auto_ptr和shared_ptr
- auto_ptr和shared_ptr
- Auto_ptr和shared_ptr
- auto_ptr和shared_ptr
- c++智能指针的使用,auto_ptr,shared_ptr
- C++常用的智能指针auto_ptr、shared_ptr
- 智能指针std::auto_ptr和tr1:shared_ptr用法(总结的最好的一篇)
- 智能指针:auto_ptr和shared_ptr
- 智能指针(auto_ptr 和 shared_ptr)
- 智能指针(auto_ptr 和 shared_ptr)
- 智能指针(auto_ptr 和 shared_ptr)
- Mysql中的Btree与Hash索引比较
- python中find()的用法
- C语言位域操作
- jQuery笔记——动画设计——复杂动画
- 最近5年133个Java面试问题列表
- 推荐cpp的shared_ptr和auto_ptr的文章
- redis相关
- web前端学习路线以及 侧重点==拒绝浪费不需要的精力
- DD+、E-AC-3 、EC3三个说的是同一种格式
- 微信硬件蓝牙jsapi之getWXDeviceInfos接口获取设备deviceid(10)
- 在windows中运行和打开.jar文件
- 微信公众号 隐藏菜单
- 简单的加载动画
- Android安全与逆向之Dalvik虚拟机架构和如何执行程序以及JIT(即时编译)