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搭配使用来避免循环引用的。
有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搭配使用来避免循环引用的。
相关文章推荐
- boost::smart_ptr之智能指针
- 多索引容器boost::multi_index_container储存共享智能指针boost::shared_ptr
- 学习笔记四:boost智能指针:scoped_ptr和shared_ptr
- Boost智能指针——shared_ptr
- 详解 boost 库智能指针(scoped_ptr<T> 、shared_ptr<T> 、weak_ptr<T> 源码分析)
- Boost 智能指针错误shared_ptr Assertion px != 0 failed
- Boost智能指针——shared_ptr
- boost::share_ptr智能指针使用示例
- Boost智能指针之scoped_ptr
- 几种智能指针的比较(std::auto_ptr、boost::scoped_ptr、boost::shared_ptr、boost::weak_ptr)
- boost 智能指针 shared_ptr 原理分析
- Boost智能指针——shared_ptr
- boost::share_ptr智能指针使用示例
- Smart pointers to boost your code(智能指针)
- Boost智能指针:scoped_ptr
- 智能指针tr1::shared_ptr、boost::shared_ptr使用
- Boost智能指针——shared_ptr
- 智能指针boost::scoped_ptr
- (推荐)智能指针boost::weak_ptr 详解
- [6] 智能指针boost::weak_ptr