ITPub博客

首页 > Linux操作系统 > Linux操作系统 > auto_ptr 智能指针

auto_ptr 智能指针

原创 Linux操作系统 作者:licup123 时间:2009-01-08 11:01:09 0 删除 编辑
       auto_ptr是现在标准库里面一个轻量级的智能指针的实现,存在于头文件 memory中,之所以说它是轻量级,是因为它只有一个成员变量(拥有对象的指针),相关的调用开销也非常小。
void g()     
 {
T* pt1 = new T;
    //
 right now, we own the allocated object
    // pass ownership to an auto_ptr

    auto_ptr<T> pt2( pt1 );
    //
 use the auto_ptr the same way
    // we'd use a simple pointer

    *pt2 = 12;       // same as "*pt1 = 12;"

    pt2
->SomeFunc(); // same as "pt1->SomeFunc();"
   
// use get() to see the pointer value

    assert( pt1 == pt2.get() );
   
// use release() to take back ownership

    T* pt3 = pt2.release();
   
//
 delete the object ourselves, since now
   
// no auto_ptr owns it any more

     delete pt3;
}
void h()
{
    auto_ptr
<T> pt( new T(1
) );
    pt.reset( 
new T(2
) );
    
//
 deletes the first T that was
    
// allocated with "new T(1)"


}
 // finally, pt goes out of scope and
}
从上面的例子来看,auto_ptr的使用很简单,通过构造函数拥有一个动态分配对象的所有权,然后就可以被当作对象指针来使用,当auto_ptr对象被销毁的时候,它也会自动销毁自己拥有所有权的对象(嗯,标准的RAAI做法),release可以用来手动放弃所有权,reset可用于手动销毁内部对象。
 
auto_ptr的对象所有权是独占性的
       这决定了不可能有两个auto_ptr对象同时拥有同一动态对象的所有权,从而也导致了auto_ptr的拷贝行为是非对等的,其中伴随着对象所有权的转移。
      我们仔细观察auto_ptr的源码就会发现拷贝构造和赋值操作符所接受的参数类型都是非const的引用类型(auto_ptr<_Ty>& ),而不是我们一般应该使用的const引用类型
     拷贝过程中被拷贝的对象(_Right)都会被调用release来放弃所包括的动态对象的所有权,动态对象的所有权被转移了,新的auto_ptr独占了动态对象的所有权。也就是说被拷贝对象在拷贝过程中会被修改,拷贝物与被拷贝物之间是非等价的。这意味着如下的代码是错误的
     同时也不要将auto_ptr放进标准库的容器中,否则在标准库容器无准备的拷贝行为中(标准库容器需要的拷贝行为是等价的),会导致难以发觉的错误
       auto_ptr特殊的拷贝行为使得使用它来远距离传递动态对象变成了一件十分危险的行为,在传递的过程中,一不小心就会留下一些实际为空但程序本身却缺少这样认知的auto_ptr对象
       简单的说来,auto_ptr适合用来管理生命周期比较短或者不会被远距离传递的动态对象,使用auto_ptr来管理动态分配对象,最好是局限于某个函数内部或者是某个类的内部。也就是说,动态对象的产生,使用和销毁的全过程是处于一个小的受控的范围,而不会在其中加入一些适应未来时态的扩展。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10697500/viewspace-531785/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2008-06-22

  • 博文量
    51
  • 访问量
    117498