转载自http://www.cnblogs.com/qytan36/archive/2010/06/28/1766555.html

auto_ptr是C++标准库中(<utility>)为了解决资源泄漏的问题提供的一个智能指针类模板(注意:这只是一种简单的智能指针)

auto_ptr的实现原理其实就是RAII,在构造的时候获取资源,在析构的时候释放资源,并进行相关指针操作的重载,使用起来就像普通的指针。

std::auto_ptr<ClassA> 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 = ; /*调用该函数会丢失掉所有权*/
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 ;
}

输出结果是:

Enter create()

create A1

create A2

Exit create()

Enter sink()

destroy A1

Exit sink()

destroy A2

2,从上可知由于在赋值,参数传递的时候会转移所有权,因此不要轻易进行此类操作。

比如:std::auto_ptr<ClassA> 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元素之间就不等价了。

最新文章

  1. 学习Spring——依赖注入
  2. python 生成器等语法
  3. C#中Finally的一个不太常见的用法
  4. React 生命周期
  5. js各类共用方法
  6. qwebkit - Open new window after click using QT - Stack Overflow
  7. MySQL关联查询总结
  8. 博弈论(Game Theory) - 04 - 纳什均衡
  9. 从 MVC 到前后端分离
  10. hive发杂数据结构的使用,struct,array,map
  11. 【公众号系列】SAP将裁员4400人,颤抖吧!
  12. go语言fallthrough的用法心得
  13. native.js 判断是否安装某app
  14. team330团队铁大兼职网站使用说明
  15. 程序员,不要让自己做兔子(updated) 网上最近流传的一个笑话,关于兔子,狼还有一只老虎的,故事 我就是想打你了,还需要什么理由吗?谁让你是兔子 项目经理是这样当的
  16. each与list的用法(PHP学习)
  17. datagridview 如何禁止行被选中
  18. linux批量远程多服务器FTP并下载文件的脚本
  19. iOS 直播推流 - 搭建基于RTMP的本地Nginx服务器
  20. AME_PR采购申请单通过AME审批设定和测试(案例)

热门文章

  1. 在windows 环境下对于 git 服务器的安装和使用
  2. myeclipse-建立webservice服务端和客户端
  3. 图解Android - System Service 概论 和 Android GUI 系统
  4. ubuntu14.10建立热点wifi分享给手机
  5. codevs4927 线段树练习5
  6. Android视频直播解决方案(rstp、udp)
  7. POJ2492 A Bug&#39;s Life
  8. Extreme Learning Machine(ELM)的工程哲学
  9. java调用本地方法的时候报错 could not find the main class:xx.program will exit
  10. wireshark怎么抓包、wireshark抓包详细图文教程