龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > C/C++开发 >

对auto_ptr的学习(4)

时间:2009-12-22 15:42来源:未知 作者:admin 点击:
分享到:
auto_ptr pstr_auto(new string("Hello World")); pstr_auto.reset(new string("YES")); //在重置之前删除对象Hello World 在这种情况下,用字符串操作assign()对原有的字符串对象重新

  auto_ptr pstr_auto(new string("Hello World"));

  pstr_auto.reset(new string("YES")); //在重置之前删除对象Hello World

  在这种情况下,用字符串操作assign()对原有的字符串对象重新赋值,比删除原有的字符串对象并重新分配第二个字符串对象更为有效:

  //这种情况下,重置的更有效

  pstr_auto->assign("YES");

  程序设计的一个难事是:有时候仅仅得到正确的结果是不够的,有时候,我们不仅需要正确的结果,而且还需要一个可接受的性能,像调用assign()有效释放和重分配一个字符串这样的小细节就是一个很好的例子,它说明在某些情况下,这些小细节会积聚成可怕的性能瓶颈.

  auto_ptr类模板为动态分配内存提供了大量的安全性和便利性,但是我们仍需小心,否则就会陷入麻烦.

  1.我们必须小心,不能用一个指向"内存不是通过应用new表达式分配的"指针来初始化或赋值auto_ptr.如果这样做了,delete表达式会被应用在不是动态分配的指针上,这将导致未定义的程序行为.

  2.我们必须小心,不能让两个auto_ptr对象拥有空间存储区内同一对象的所有权.一种很显然犯这种错误的方法是,用同一个指针初始化或赋值两个auto_ptr对象,另一个途径是通过get()操作,例如:

  auto_ptr pstr_auto(new string("HELLO"));

  auto_ptr pstr_auto2(pstr_auto.get());

  release()操作允许将一个auto_ptr对象的底层对象初始化或赋值给第二个对象,而不会使两个auto_ptr对象同时拥有同一个对象的所有权.release(0不权像get()一样返回底层对象的地址,而且还释放该对象的所有权,前面代码可被改写如下:

  auto_ptr pstr_auto2(pstr_auto.release());

  此时两个对象仍然指向同一个对象,但是pstr_auto不再拥有拥有权.

精彩图集

赞助商链接