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

 

你可能感兴趣的:(C++,String,测试,delete,存储)