auto_ptr 与 shared_ptr 用法和区别总结

std::auto_ptr和tr1::shared_ptr的用法详见:http://blog.csdn.net/mniwc/article/details/6264006

一、std::auto_ptr 被复制后,将失去原来所致资源的所有权;*auto_ptr在头文件<memory>中。

永不建立auto_ptr的容器
关于此可以看的Effective STL的条款8

因为auto_ptr并不是完美无缺的,它的确很方便,但也有缺陷,在使用时要注意避免。首先,不要将auto_ptr对象作为STL容器的元素。C++标准明确禁止这样做,否则可能会碰到不可预见的结果

auto_ptr的另一个缺陷是将数组作为auto_ptr的参数: auto_ptr<char>  pstr (new char[12] ); //数组;为定义
然后释放资源的时候不知道到底是利用delete pstr,还是 delete[] pstr;

然后收集了关于auto_ptr的几种注意事项:
1、auto_ptr不能共享所有权。
2、auto_ptr不能指向数组
3、auto_ptr不能作为容器的成员。
4、不能通过赋值操作来初始化auto_ptr
std::auto_ptr<int> p(new int(42));     //OK
std::auto_ptr<int> p = new int(42);    //ERROR,本想通过new int(42)来产生临时对象temp(问题出在这里),再由temp拷贝构造产生p。
这是因为auto_ptr 的构造函数被定义为了explicit

std::auto_ptr<int> p = auto_ptr<int>(new int(42)); //Success   
5、不要把auto_ptr放入容器

二、std::tr1::shared_ptr 是可以共享所有权的智能指针;(推荐使用)

*shared_ptr在boost的头文件模块中.在vs最新的编译器己可用.但在vc6上却找不到该模块.

1. shared_ptr是Boost库所提供的一个智能指针的实现,shared_ptr就是为了解决auto_ptr在对象所有权上的局限性(auto_ptr是独占的),在使用引用计数的机制上提供了可以共享所有权的智能指针.
2. shared_ptr比auto_ptr更安全
3. shared_ptr是可以拷贝和赋值的,拷贝行为也是等价的,并且可以被比较,这意味这它可被放入标准库的一般容器(vector,list)和关联容器中(map)。

关于shared_ptr的使用其实和auto_ptr差不多,只是实现上有差别,关于shared_ptr的定义就不贴代码了,以为内开源,可以网上找
1、shared_ptr<T> p(new Y);

再来说说shared_ptr的缺点。

1.对于使用引用计数的智能指针来说,必须要小心出现循环引用。
     在重度使用
shared_ptr的系统中,你必须一开始就明确类与类的关系,以决定哪里使用shared_ptr,哪里使用weak_ptr,否则就会出现内存泄露。而shared_ptr的接口转换的灵活性,也很容易导致智能指针被滥用。内存自动管理的问题并没有得到解决,它只是被转移了。

2.shared_ptr使用非嵌入式设计,这样可以使用于基本类型,比如 shared_ptr<int>。但是根据个人经验,这种情况在很少使用。大部分情况还是使用自己设计的类。这有一个问题,就是没有很方便的办法实现this指针和智能指针的转换。标准库中提供了enable_shared_from_this类来解决这个问题。但这已经使所谓的非嵌入式设计徒有虚名。而假如一开始采用嵌入式设计的话,则在性能代价和多线程设计方面具有更大的灵活性。


要了解更多关于auto_ptr的信息,可以查看more effective c++ 的p158页条款28
要了解shared_ptr 类模板信息,可以查看boost 1.37.0中文文档,而且支持数组的shared_array 类模板

 

关于boost中shared_ptr使用方法的一些例子 

详见:http://blog.csdn.net/agul_/article/details/8088295

 

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值