智能指针(auto_ptr 和 shared_ptr)

转自:http://www.cppblog.com/expter/archive/2009/03/29/78270.html

都是这周看书以及代码的总结:



Stl 中 auto_ptr只是众多可能的智能指针之一,auto_ptr所做的事情,就是动态分配对象以及当对象不再需要时自动执行清理。

这里是一个简单的代码示例,如果没有auto_ptr,



1智能指针(auto_ptr 和 shared_ptr)voidProcessAdoption(istream&data)

2智能指针(auto_ptr 和 shared_ptr)智能指针(auto_ptr 和 shared_ptr)智能指针(auto_ptr 和 shared_ptr){

3智能指针(auto_ptr 和 shared_ptr)

4智能指针(auto_ptr 和 shared_ptr)while(data)//如果还有数据

5智能指针(auto_ptr 和 shared_ptr)智能指针(auto_ptr 和 shared_ptr)智能指针(auto_ptr 和 shared_ptr){

6智能指针(auto_ptr 和 shared_ptr) ALA*pa=readALAData(data);//取出下一个数据

7智能指针(auto_ptr 和 shared_ptr)pa->DealProcessAdoption(data);//处理

8智能指针(auto_ptr 和 shared_ptr)

9智能指针(auto_ptr 和 shared_ptr) delete pa;//释放资源

10智能指针(auto_ptr 和 shared_ptr)}


11智能指针(auto_ptr 和 shared_ptr)return;

12智能指针(auto_ptr 和 shared_ptr)}


如果在DealProcessAdoption有一个exception,会发生什么事情,因为ProcessAdoption不能捕获他,所以这段代码很危险,所以DealProcessAdoption后面的代码可能会跳过,造成内存泄露。

如果利用try catch去捕获他,会搞得代码很乱,又缺少美观性。

所以Stl提供了一个智能指针来解决这个问题,我们可以先模拟实现一个智能指针的类实现。

1智能指针(auto_ptr 和 shared_ptr)//关于一个智能指针的定义

2智能指针(auto_ptr 和 shared_ptr)template<typename Type>

3智能指针(auto_ptr 和 shared_ptr)classauto_ptr

4智能指针(auto_ptr 和 shared_ptr)智能指针(auto_ptr 和 shared_ptr)智能指针(auto_ptr 和 shared_ptr){

5智能指针(auto_ptr 和 shared_ptr)public:

6智能指针(auto_ptr 和 shared_ptr) auto_ptr(Tp=NULL) :Ptr(p)

7智能指针(auto_ptr 和 shared_ptr)智能指针(auto_ptr 和 shared_ptr)智能指针(auto_ptr 和 shared_ptr){ }

8智能指针(auto_ptr 和 shared_ptr)~auto_ptr()

9智能指针(auto_ptr 和 shared_ptr)智能指针(auto_ptr 和 shared_ptr)智能指针(auto_ptr 和 shared_ptr){

10智能指针(auto_ptr 和 shared_ptr) delete Ptr;

11智能指针(auto_ptr 和 shared_ptr) }


12智能指针(auto_ptr 和 shared_ptr)private:

13智能指针(auto_ptr 和 shared_ptr) Type
Ptr;

14智能指针(auto_ptr 和 shared_ptr)};

15智能指针(auto_ptr 和 shared_ptr)

16智能指针(auto_ptr 和 shared_ptr)

17智能指针(auto_ptr 和 shared_ptr)voidProcessAdoption(istream&data)

18智能指针(auto_ptr 和 shared_ptr)智能指针(auto_ptr 和 shared_ptr)智能指针(auto_ptr 和 shared_ptr){

19智能指针(auto_ptr 和 shared_ptr)

20智能指针(auto_ptr 和 shared_ptr)while(data)//如果还有数据

21智能指针(auto_ptr 和 shared_ptr)智能指针(auto_ptr 和 shared_ptr)智能指针(auto_ptr 和 shared_ptr){

22智能指针(auto_ptr 和 shared_ptr) auto_ptr<ALA>pa(readALADara(data));

23智能指针(auto_ptr 和 shared_ptr) pa->DealProcessAdoption(data);

24智能指针(auto_ptr 和 shared_ptr) }


25智能指针(auto_ptr 和 shared_ptr)return;

26智能指针(auto_ptr 和 shared_ptr)}


这个版本和原先版本的差异只有二处,

第一pa是一智能指针的对象,不是ALA*

第二不用自己去释放delete

然后我看到Effective STL的条款

8:永不建立auto_ptr的容器

关于此可以看的Effective STL的条款8

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

auto_ptr的另一个缺陷是将数组作为auto_ptr的参数: auto_ptr 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 p(new int(42)); //OK

std::auto_ptr p = new int(42); //ERROR

这是因为auto_ptr 的构造函数被定义为了explicit

5、不要把auto_ptr放入容器

然后笔者从而推荐的是boost的shared_ptr,然后看完shared_ptr关于智能指针的介绍与例子。

5种针对auto_ptr不足的指针如下:需要详细了解可以去查看相当文档,与测试新代码。

[**scoped_ptr**](http://www.cnblogs.com/pamxy/admin/) [](http://www.cnblogs.com/pamxy/admin/) 简单的单一对象的唯一所有权。不可拷贝。
[**scoped_array**](http://www.cnblogs.com/pamxy/admin/) [](http://www.cnblogs.com/pamxy/admin/) 简单的数组的唯一所有权。不可拷贝。
[**shared_ptr**](http://www.cnblogs.com/pamxy/admin/) [](http://www.cnblogs.com/pamxy/admin/) 在多个指针间共享的对象所有权。
[**shared_array**](http://www.cnblogs.com/pamxy/admin/) [](http://www.cnblogs.com/pamxy/admin/) 在多个指针间共享的数组所有权。
[**weak_ptr**](http://www.cnblogs.com/pamxy/admin/) [](http://www.cnblogs.com/pamxy/admin/) 一个属于 **shared_ptr** 的对象的无所有权的观察者。
[**intrusive_ptr**](http://www.cnblogs.com/pamxy/admin/) [](http://www.cnblogs.com/pamxy/admin/) 带有一个侵入式引用计数的对象的共享所有权。


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 p(new Y);


要了解更多关于auto_ptr的信息,可以查看more effective c++ 的p158页条款28

要了解shared_ptr 类模板信息,可以查看boost 1.37.0中文文档,而且支持数组的shared_array 类模板

posted on 2009-03-29 15:50 expter 阅读(15483) 评论(2) 编辑 收藏引用 所属分类:其他学习笔记算法与数据结构

原文链接: https://www.cnblogs.com/pamxy/archive/2013/05/31/3110669.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/90725

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月10日 上午12:49
下一篇 2023年2月10日 上午12:49

相关推荐