本文共 2034 字,大约阅读时间需要 6 分钟。
weak_ptr:
weak_ptr是为了配合shared_ptr而引入的一种智能指针,它更像是shared_ptr的一个助手而不是智能指针,因为它不具有普通指针的行为,没有重载operator*和->,它的最大作用在于协助shared_ptr工作,像旁观者那样观测资源的使用情况. 用法: weak_ptr被设计为与shared_ptr共同工作,可以从一个shared_ptr或者另一个weak_ptr对象构造,获得资源的观测权。但weak_ptr没有共享资源,它的构造不会引起指针引用计数的增加。 使用weak_ptr的成员函数use_count()可以观测资源的引用计数,另一个成员函数expired()的功能等价于use_count()==0,但更快,表示被观测的资源(也就是shared_ptr的管理的资源)已经不复存在。 weak_ptr可以使用一个非常重要的成员函数lock()从被观测的shared_ptr获得一个可用的shared_ptr对象, 从而操作资源。但当expired()==true的时候,lock()函数将返回一个存储空指针的shared_ptr. 实例: #include <boost/smart_ptr.hpp> #include <boost/make_shared.hpp> using namespace boost; using namespace std; int _tmain(int argc, _TCHAR* argv[]) { shared_ptr<int> sp(new int(10)); assert(sp.use_count() == 1); weak_ptr<int> wp(sp); //从shared_ptr创建weak_ptr assert(wp.use_count() == 1); if (!wp.expired())//判断weak_ptr观察的对象是否失效 { shared_ptr<int> sp2 = wp.lock();//获得一个shared_ptr *sp2 = 100; assert(wp.use_count() == 2); } assert(wp.use_count() == 1); return 0; }获得this的shared_ptr
weak_ptr的一个重要用途是获得this指针的shared_ptr,使对象自己能够生产shared_ptr管理自己;对象使用weak_ptr观测this指针,这并不影响引用计数,在需要的时候就调用lock()函数,返回一个符合要求的shared_ptr共外界使用. 这个解决方案被实现为一个惯用法,在头文件<boost/enable_shared_from_this.hpp>定义了一个助手类enable_shared_from_this<T>,它的声明摘要如下: template<class T> class enable_shared_from_this { public: shared_ptr<T> shared_from_this(); } 使用的时候只需要让像被shared_ptr管理的类从它继承即可,成员函数shared_from_this()会返回this的shared_ptr.例如: #include <boost/make_shared.hpp> #include <boost/enable_shared_from_this.hpp> using namespace boost; using namespace std; class self_shared: public enable_shared_from_this<self_shared> { public: self_shared(int n):x(n){} int x; void print() {cout<<" self_shared:"<<x<<endl;} }; int _tmain(int argc, _TCHAR* argv[]) { shared_ptr<self_shared> sp = make_shared<self_shared>(314); sp->print(); shared_ptr<self_shared> p = sp->shared_from_this(); p->x = 1000; p->print(); return 0; }注意:千万不能从一个普通对象(非shared_ptr)使用shared_from_this()获去shared_ptr,例如
self_shared ss; shared_ptr<self_shared> p = ss.shared_from_this();//错误! 在运行时会导致shared_ptr析构时企图删除一个栈上分配的对象,发生未定义行为。转载地址:http://csmbn.baihongyu.com/