注:C++11 已不推荐使用,应使用scoped_ptr/shared_ptr. 部分原因就是如下的注意事项。

转自:http://patmusing.blog.163.com/blog/static/13583496020101824541270/

a. auto_ptr定义于头文件memory中;

b. auto_ptr只能用来管理单个动态创建的对象,而不能管理动态创建的数组;

c. 和其他copy和assign不同,auto_ptr的copy和assign会改变右边的操作数,assignment符号的两边的auto_ptr均为左值;There is a crucially important difference between how auto_ptr and built-in pointers treat copy and assignment. When we copy an auto_ptr or assign its value to another auto_ptr, ownership of the underlying object is transferred from the original to the copy. The original auto_ptr is reset to an unbound state;

d. auto_ptr不能作为容器中的元素;

auto_ptr的copy和assign具有析构行为,这就是auto_ptr不能作为容器元素的原因,因为标准库中的容器有对元素的要求:经

过copy或者assign后的两个对象,必须相等;

e. 在判断一个auto_ptr是否被绑定的时候,不能直接使用auto_ptr对象:

auto_ptr<Student> stu1(new Student);

if(stu1)

{

cout << "stu1 is bound" << endl;

}

else

{

cout << "stu1 is unbound" << endl;

}

这样做将会导致compile error,应该改为:

auto_ptr<Student> stu1(new Student);

if(stu1.get()) // get()获取的是underlying对象的指针,如果被绑定则非零,如果没有被绑定则为0

{

cout << "stu1 is bound" << endl;

}

else

{

cout << "stu1 is unbound" << endl;

}

f. auto_ptr的构造函数是explicit的,消除了隐式的类型转换(在这里即,从指针类型到auto_ptr类型的转换),因此不能直接将一个

指针赋给一个auto_ptr对象。如下面这样的代码:

auto_ptr<Student> stu5 = new Student;

stu5->printStudentInfo();

在编译的时候不会有问题,但会出现严重的runtime error。正确的做法应该是:

auto_ptr<Student> stu5(new Student);

stu5->printStudentInfo();

g. 不同用两个auto_ptr绑定到同一个对象。

// stu6和stu7绑定到了同一个对象,这将会导致该对象被析构两次,将会产生runtime error

auto_ptr<Student> stu6(new Student("Evanligine", "F", 8));

auto_ptr<Student> stu7(stu6.get());

后面一句,应该改为:

auto_ptr<Student> stu7(stu6);

这样stu6就将ownership转交给了stu7,stu6则成为了unbound的auto_ptr。

h. 不能用auto_ptr指向静态资源分配对象。如下面的代码,尽管可以通过编译,但将会产生runtime error:

int ix = 10;

auto_ptr<int> pint1(&ix);

i. auto_ptr的重要操作

auto_ptr<T> ap; 创建一个未绑定的auto_ptr对象ap

auto_ptr<T> ap(p); 创建一个auto_ptr对象ap,它绑定了指针p所指向的对象。该构造函数是explicit的

auto_ptr<T> ap1(ap2); 创建一个auto_ptr对象ap1,它绑定到原来被ap2绑定的对象,ap2则成为未绑定的auto_ptr

ap1 = ap2; ap1删除原来绑定的对象,ap2将ownership移交给ap1,ap2成为未绑定的auto_ptr

*ap 返回ap绑定的对象的引用。可以通过*给被绑定的内在对象赋值。如下面代码:

auto_ptr<int> pint(new int(3));

cout << *pint << endl; // 输出3

*pint = 100;

cout << *pint << endl; // 输出100

ap-> 返回被ap绑定的对象的指针

ap.reset(p) 如果指针p和ap绑定的内存对象的指针不相同,那么ap删除被其绑定的内存对象,改而绑定p所

指向的对象.

ap.release() 返回ap所绑定对象的指针,并使ap成为未绑定对象

ap.get() 返回ap所绑定对象的指针

使用auto_ptr需要注意的事项的更多相关文章

  1. c++ auto_ptr笔记

    1.auto_ptr 不可以使用指针惯用的赋值初始化方式,只能直接初始化. 示例:  char *p = 'A';//error  auto_ptr<char>ptr = new char ...

  2. auto_ptr,shared_ptr 智能指针的使用

    Q: 那个auto_ptr是什么东东啊?为什么没有auto_array?A: 哦,auto_ptr是一个很简单的资源封装类,是在<memory>头文件中定义的.它使用“资源分配即初始化”技 ...

  3. c++11 auto_ptr介绍

    在代码里面看到了auto_ptr这个东西,正好以前一哥们曾经问过我这个问题..所以特意去搜了搜帖子,学习学习 http://www.cnblogs.com/gaoxianzhi/p/4451803.h ...

  4. 智能指针auto_ptr & shared_ptr

    转载:智能指针auto_ptr 很多人听说过标准auto_ptr智能指针机制,但并不是每个人都天天使用它.这真是个遗憾,因为auto_ptr优雅地解决了C++设计和编码中常见的问题,正确地使用它可以生 ...

  5. C++ Primer 与“类”有关的注意事项总结

    C++ 与"类"有关的注意事项总结(一) 1. 除了静态 static 数据成员外,数据成员不能在类体中被显式地初始化. 例如 : class First { int memi = ...

  6. C++智能指针 auto_ptr

    C++智能指针 auto_ptr auto_ptr 是一个轻量级的智能指针, 定义于 memory (非memory.h)中, 命名空间为 std. auto_ptr 适合用来管理生命周期比较短或者不 ...

  7. auto_ptr类

    auto_ptr是一个模板类,用于管理动态内存分配. 请看下面的函数: void remodel (string& str) { string * ps = new string(str); ...

  8. shared_ptr 和auto_ptr智能指针

    shared_ptr:计数的智能指针 它是一个包装了new操作符在堆上分配的动态对象,但它实现的是引用计数型的智能指针 ,可以被自由地拷贝和赋值,在任意的地方共享它,当没有代码使用(引用计数为0)它时 ...

  9. C++智能指针--auto_ptr指针

    auto_ptr是C++标准库提供的类模板,头文件<memory>,auto_ptr对象通过初始化指向由new创建的动态内存,它是这块内存的拥有者,一块内存不能同一时候被分给两个拥有者.当 ...

随机推荐

  1. SQL Server2012如何更改服务器的名称

    Problem: sql server 2012 安装完毕后,连接数据库只能使用 机器名\数据库实例 的方式,想用 localhost 或 . 作为服务器名称不可以 Solution: 参考:http ...

  2. ZOJ Monthly, January 2019 I Little Sub and Isomorphism Sequences(set 妙用) ZOJ4089

    写这篇博客来证明自己的愚蠢 ...Orz  飞机 题意:给定你个数组,以及一些单点修改,以及询问,每次询问需要求得,最长的字串长度,它在其他位置存在同构 题解:经过一些奇思妙想后 ,你可以发现问题是传 ...

  3. HDU 6189 Law of Commutation(规律)

    题意: 给定n,a,求区间 [ 1 , 1<<n ] 的数b 满足 的个数 分析:打出暴力程序可以发现当a为奇数的时候结果为一: 当a为偶时 , a^b=2^(k+b)mod 2^n ; ...

  4. VBS常用脚本及其解说一览

    取得本机IP strComputer = "." Set objWMIService = GetObject("winmgmts:\\" & strCo ...

  5. php安装composer

    php.ini打开三个扩展: extension=php_mbstring.dll extension=php_openssl.dll extension=php_pdo_mysql.dll

  6. Web Worker 案例

    什么是 Web Worker? 当在 HTML 页面中执行脚本时,页面的状态是不可响应的,直到脚本已完成. web worker 是运行在后台的 JavaScript,独立于其他脚本,不会影响页面的性 ...

  7. 关于在scrapy中使用xpath

    1. 还是以虎嗅为例,他给我返回的是一个json格式的json串 2.那么我需要操作的就是把json串转换成我们的字典格式再进行操作 str=json.loads(response.body)['da ...

  8. docker 安装使用gitlab

    官方镜像地址  ce版本: https://hub.docker.com/r/gitlab/gitlab-ce 文档地址: https://docs.gitlab.com/omnibus/docker ...

  9. 实现类似tail -f file功能

    python版本py3 tail -f file是打印最后10行,然后跟踪文件追加的内容打印出来. python3 以为本方式打开的话,不能回退(f.seek(-1,1)),所有以'rb'方式打开文件 ...

  10. AutoFac之 Named and Keyed 方式注入

    AutoFac是.net framework下一个高效的ioc容器,传说中的效率最快(我偷偷看了几篇测试博文,确实这个容器的效率遥遥领先). 好了废话不多说,AutoFac的使用方式请看:http:/ ...