需要头文件: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》