您的位置:首页 > 编程语言 > C语言/C++

boost.Smart_ptr中智能指针

2014-02-21 13:47 267 查看
只能指针解决了资源生存期管理的问题(尤其是动态分配的对象),它们保存指向动态分配对象的指针,并在正确的时候删除这些对象,并且通过对可定制删除器的支持,shared_ptr可以支持那些不是使用delete进行析构的资源。

有3中典型的情况适合使用只能指针:

1)资源所有全的共享。

2)要写异常安全的代码时。

3)避免常见的错误,如资源泄漏。

同时智能指针可用作容器的元素,这就使得智能指针使用于标准库。smart_ptr中最主要的智能指针有scoped_ptr,shared_ptr,weak_ptr。下面逐一介绍:

scoped_ptr:用于确保能够正确的删除动态分配的对象。由于继承与boost::noncopyable,使得scoped_ptr永远不能被赋值或复制,当scoped_ptr被销毁时,它对它所拥有的指针调用delete。

shared_ptr:可以从一个裸指针、另一个shared_ptr、或者一个weak_ptr构造,还可以传递第二个参数给shared_ptr的构造函数,它被称为删除器(deleter)。这对于管理那些不是用new分配也不是用delete释放的资源非常有用。shared_ptr被创建后,就可以想普通指针一样使用了,除了不能被显示地删除。shared_ptr析构函数对引用计数减1.如果计数为零,则保存的指针被删除。删除指针的方法是调用operator delete或者如果给定了一个执行删除操作的删除器对象,就把保存的指针作为唯一参数调用这个对象。从this创建shared_ptr的方法是public继承自enable_shared_from_this,这样调用shared_from_this()就可以获得this的shared_ptr。需要注意的是,shared_from_this()不能在构造函数里调用,因为在构造函数里面,this还没有交给shared_ptr接管。

weak_ptr是shared_ptr的观察员。weak_ptr可以防止递归的依赖关系,或者避免悬空指针,可以使用lock()从一个weak_ptr构造一个shared_ptr,从而共享取得对共享资源的访问权。weak_ptr总是需要和shared_ptr一起使用。上一篇blog中就是使用weak_ptr和shared_ptr搭配使用来避免循环引用的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息