使用auto_ptr需要注意的事项

转载 2012年03月28日 23:24:21

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

 

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

 

c. 和其他copyassign不同,auto_ptrcopyassign会改变右边的操作数,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_ptrcopyassign具有析构行为,这就是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绑定到同一个对象。

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

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

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

         后面一句,应该改为:

         auto_ptr<Student> stu7(stu6);

         这样stu6就将ownership转交给了stu7stu6则成为了unboundauto_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删除原来绑定的对象,ap2ownership移交给ap1ap2成为未绑定的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)                       如果指针pap绑定的内存对象的指针不相同,那么ap删除被其绑定的内存对象,改而绑定p

         指向的对象.

ap.release()                     返回ap所绑定对象的指针,并删除该被绑定的对象

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

使用auto_ptr需要注意的事项 .

a. auto_ptr定义于头文件memory中;   b. auto_ptr只能用来管理单个动态创建的对象,而不能管理动态创建的数组;   c. 和其他copy和assign不同,auto...
  • erick08
  • erick08
  • 2012年03月28日 14:59
  • 256

使用auto_ptr需要注意的事项

本文移至:http://patmusing.blog.163.com/blog/static/13583496020101824541270/
  • pathuang68
  • pathuang68
  • 2009年11月29日 15:23
  • 1225

微信群发消息注意事项

1,群发里的图片必须上传到微信服务器里才可以 2,群发时候注意屏蔽空格空行,否则可能会CSS样式不一样 下边我简单讲解下思路 群发图片如何处理?群发的时候可以通过编辑器里的单图片上传功能进行上传...
  • fengyu19880219
  • fengyu19880219
  • 2016年02月03日 17:09
  • 1018

使用Select的3个注意事项

#include  int select(int n, fd_set *readfds, fd_set*writefds, fd_set *exceptfds, struct timeval *tim...
  • zhenjing
  • zhenjing
  • 2010年05月17日 17:04
  • 900

自定义函数,函数的使用注意事项,自定义对象,对象直接量

4  自定义函数 : 如果一段代码需要被重复编写和使用,那么我们未来方便统一编写使用,可以将其封装近一个函数(方法)中。 作用:增强代码的复用性 函数格式: function 方法名(参数列表){ ...
  • boss_way
  • boss_way
  • 2017年10月28日 15:01
  • 247

Solr中的注意点

注意点1–注意重启 当修改了配置文件后,一定要重启Solr才能生效; 自动补全时,插入新数据后,一定要重新build,即勾选“spellcheck”及下面的“spellcheck.build”并执行即...
  • u012948976
  • u012948976
  • 2016年11月16日 22:33
  • 704

[Java Performance] 字符串拼接注意事项

字符串拼接(String Concatenation) // 编译器优化前 String answer = integerPart + "." + mantissa; // 编译器优化后 St...
  • dm_vincent
  • dm_vincent
  • 2014年09月26日 12:32
  • 3750

java--Servlet操作注意事项

1、Servlet程序编写 ----- 生命周期 2、ServletAPI Request Response  3、Cookie 和 Session  Servlet 用来 动态web资...
  • samkieth
  • samkieth
  • 2016年04月20日 20:18
  • 805

EditText的一些注意事项

1、一般来说,EditText是不会顶格或者置顶输入的,文字与EditText的边框有一小段距离,可用padding实现:android:paddingLeft="10dp" android:padd...
  • Hebin320320
  • Hebin320320
  • 2015年09月08日 10:48
  • 486

写HTMl注意事项

1.先观察 那些结构是一样的,  一样的统一用class 细节 决定一切  代码 千万注意 ID用法, 宁愿多创建类, css,  不要看2个块内容外表差不多就复制 粘贴完事, 要考虑内部内容是否...
  • li3196672779
  • li3196672779
  • 2017年05月31日 08:50
  • 212
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用auto_ptr需要注意的事项
举报原因:
原因补充:

(最多只允许输入30个字)