auto_ptr 智能指针

auto_ptr是一种智能指针,帮助程序员防止”被异常抛出时发生资源泄露“。auto_prt只是针对某个特定问题而设计,对于其他问题无能为力。

设计动机

当你在某个局部new出一些对象的时候,还没有正常的delete,中间抛出了异常,导致无法执行delete,从而导致了资源泄露。而auto_prt保证只要自己被销毁,就一定连带释放其所指向的资源。如:

当使用auto_ptr,就不再需要delete了,当auto_ptr超出了作用域,会自动的回首资源。

auto_ptr的接口与一般指针非常相似。*用来获取所指对象,->用来指向对象中的成员。但是它不能做指针算术。

注意:auto_ptr<> 不允许你使用一般指针惯用的赋值初始化方式,你必须使用数值来完成初始化。

auto_ptr拥有权的转移

auto_ptr是明确的所有观念。由于auto_ptr会删除其所指对象,所以这个对象绝对不能同时被其他对象拥有。绝对不应该出现多个auto_ptr同时拥有一个对象。

所以auto_ptr的拷贝构造函数和赋值操作将交出对象的拥有权。

第一个语句中ptr1拥有对象,第二个语句中ptr1将对象转交给ptr2,ptr1不再拥有。赋值也差不多

如果ptr2在赋值前拥有对象,那么赋值动作发生时会调用delete将对象删除。

函数间的auto_ptr

拥有权的转移使得auto_ptr产生了一种特殊的用法:某个函数可以利用auto_ptr将拥有权转交给另一个函数。

  1. 向某个函数内传递auto_ptr。

    如果f不再将ptr1传递出去,那么它指向的对象将在f退出时销毁。

  2. 函数向外返回auto_ptr。

    这样,f中的auto_ptr指向对象所有权将转移到了g中。

缺陷

auto_ptr语义本身就包含了拥有权,如果你无意转交了所有权,就不要用着函数的参数列表和函数返回值中。

下面的例子中函数只是想打印出auto_ptr指向的值,却得到了对象的所有权。

我们可以使用const来保留所有权,防止意外的转移

正确的打印

auto_ptr的错误使用
  1. auto_ptr 之间不能共享所有权
  2. 并不存在针对array而设计的auto_ptr,不要使用new[]所生成的数组作为初值。
  3. auto_ptr不是一个通用的智能型指针
  4. auto_ptr不满足stl容器对其元素的要求

成员函数

get
  • 返回auto_ptr所指对象的地址
  • 如果auto_ptr未拥有任何对象,则返回NULL指针
  • 这个动作不改变拥有权。退出此函数,auto_ptr仍然保持对对象的拥有权。

release
  • 放弃auto_ptr原先拥有对象的拥有权
  • 返回auto_ptr原先拥有对象的地址
  • 原先未拥有任何对象,返回NULL指针

reset(T* ptr = 0)
  • 以ptr重新初始化auto_ptr
  • 如果auto_ptr原本拥有对象,则在此动作前删除对象
  • 调用结束后,*this成为ptr拥有者。
  • 如果ptr不是NULL指针,则应当是new返回的值。
  • 不要用new[]返回的值

发表评论

电子邮件地址不会被公开。 必填项已用*标注