auto_ptr

需要头文件:memory

auto_ptr 只能用于管理从 new 返回的一个对象,它不能管理动态分配的数组

用法:

auto_ptr<string> p ( new string(“hello”) )

auto_ptr<int> p ( new int (1024) )

注意不能用赋值原始指针,因为=的右操作数也必需是auto_ptr 对象

auto_ptr<string> p = new string(“hello”) ) // 错误

p 在对象超出作用域时自动删除,如果发生异常则p也会自动删除。

auto_ptr 类定义了解引用操作符(*)和箭头操作符(->),因此它可以象普通指针一样使用。

l         auto_ptr的复制和赋值

当复制或赋值auto_ptr对象后,原来的auto_ptr对象将让出对基础对象的所有职责并重置为未绑定状态。

auto_ptr<string> ap1 ( new string (“hello”) )

auto_ptr<string> ap2 ap1  // 复制

auto_ptr<string> ap2 = ap1          // 赋值

因此,复制或赋值后,ap1将不再指向任何对象。

除了将所有权从右操作数转给左操作数之外,赋值还删除左操作数原来指向的对象——假如两个对象不同,通常自身赋值没有效果。

auto_ptr<string> ap3 ( new string (“new hello”) )

ap3 = ap2  // 这将导致ap3 先删除原有对象

       因为复制和赋值是破坏性的操作,所以不能将auto_ptr对象存储在标准容器中。标准容器类要求在复制或赋值之后两个对象相等。

l         如何测试指针有效

要测试auto_ptr 对象是否未绑定,必需使用它的 get 成员函数。而不能原始指针一样,直接检查变量本身。

T *get() const throw();

注意:get 虽然返回原始指针,但只能用于查询 ,不能用在创建其它auto_ptr对象的实参。否则将导致两个auto_ptr对象保存相同的指针,该指针就会被 delete 两次。

l         如何赋值原始指针

auto_ptr 对象与原始指针的另一个区别是,不能直接将一个原始指针赋给auto_ptr对象:

auto_ptr<string> p = new string(“hello”) ) // 错误

而必需调用 reset 函数来改变指针:

p_auto.reset ( new int (1024) )

要复位auto_ptr对象,可以将0传给 reset 函数。

说明:reset 会删除auto_ptr 对象所指的指针(如果有)。

参考: 《 C++  Primer》

 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值