c++ 智能指针

来源:互联网 发布:在哪里转让淘宝店铺 编辑:程序博客网 时间:2024/05/10 10:15

auto_ptr:
auto_ptr存在隐式的所有权转换,在c11的标准中使用新的智能指针来代替。不能用于管理动态分配的数组,被复制和赋值时也会发生所有权转换,也就不能用于标准容器器类型之中,在c11中可以使用其它的方式代替。
使用auto_ptr常见的有两种场景,一是作为智能指针传递到产生auto_ptr的函数外部,二是使用auto_ptr作为RAII管理类,在超出auto_ptr的生命周期时自动释放资源。
对于第1种场景,可以使用boost::shared_ptr或者是std::tr1::shared_ptr(在C++11标准中是std::shared_ptr)来代替。
对于第2种场景,可以使用boost::scoped_ptr或者C++11标准中的std::unique_ptr来代替。其中std::unique_ptr是std::auto_ptr的代替品,支持显式的所有权转移

shared_ptr:
shared_ptr的作用有如同指针,但会记录有多少个shared_ptrs共同指向一个对象。这便是所谓的引用计数(reference counting)。一旦最后一个这样的指针被销毁,也就是一旦某个对象的引用计数变为0,这个对象会被自动删除。这在非环形数据结构中防止资源泄露很有帮助。

weak_ptr:
weak_ptr是为配合shared_ptr而引入的一种智能指针来协助shared_ptr工作,它可以从一个shared_ptr或另一个weak_ptr对象构造,它的构造和析构不会引起引用记数的增加或减少。没有重载*和->但可以使用lock获得一个可用的shared_ptr对象
weak_ptr的一个重要用途是通过lock获得this指针的shared_ptr,使对象自己能够生产shared_ptr来管理自己,但助手类enable_shared_from_this的shared_from_this会返回this的shared_ptr,只需要让想被shared_ptr管理的类从它继承即可

unique_ptr:
unique_ptr它持有对对象的独有权——两个unique_ptr不能指向一个对象,不能进行复制操作只能进行移动操作。unique_ptr在超出作用域,即以下情况时它指向的对象会被摧毁:
unique_ptr指向的对象被破坏对象通过operator=()或reset()被指定到另一个指针)
unique_ptr还可能没有对象,这种情况被誉为empty。
例如:
std::unique_ptr<int>p1(newint(5));
std::unique_ptr<int>p2=p1;// 编译会出错
std::unique_ptr<int>p3=std::move(p1);// 转移所有权, 现在那块内存归p3所有, p1成为无效的针.
p3.reset();//释放内存.
p1.reset();//实际上什么都没做.

allocator
allocator类是C++的一个模板,它提供类型化的内存分配以及对象的分配和撤销。

0 0
原创粉丝点击