本文是基于gcc-4.9.0的源代码进行分析,shared_ptr和weak_ptr是C++11才加入标准的,所以低版本的gcc源码是没有shared_ptr和weak_ptr的,建议选择4.9.0或更新的版本去学习,不同版本的gcc源码差异应该不小,但是原理和设计思想的一样的,下面给出源码下载地址http://ftp.gnu.org/gnu/gcc 3、智能指针概念 智能指针(S...
当我们尝试通过std::weak_ptr获取一个std::shared_ptr时(例如使用lock()方法),控制块会被检查以确定对象是否还活着。如果对象还活着,lock()会返回一个有效的std::shared_ptr,引用计数增加。如果对象已经被销毁,则返回一个空的std::shared_ptr。 解决循环引用问题 循环引用问题通常发生在使用std::shared_ptr的对...
可以使用 weak_ptr 弱引用指向该对象,而不是使用 shared_ptr 强引用。
cout<<"obj use count is"<< obj.use_count() << endl;//1--尽管weak_ptr也指向obj,但他只是监听者,本身并不影响引用计数次数{//weak_ptr使用方法//外部至少还有一个shared_ptr来管理资源,同时p自己本身的资源 -- p.use_count >= 2auto p = weakObj.lock();//auto == ObjectPtrif(p) { cout...
weak_ptr是对对象的一种弱引用,它不会添加对象的引用计数。weak_ptr和shared_ptr之间能够相互转换。shared_ptr能够直接赋值给week_ptr,week_ptr可通过调用lock函数来获得shared_ptr(假设对象已经被释放,则返回一个空的shared_ptr)。 单纯使用shared_ptr有时会产生问题,考虑以下的代码: ...
C++ 中使用 std::shared_ptr 智能指针不当有可能会造成循环引用,因为 std::shared_ptr 内部是基于...
如前所述 boost::shared_ptr<Type> ptr = weak_ptr.lock();如果您不想要异常或只是使用强制转换构造函数 boost::shared_ptr<Type> ptr(weak_ptr);如果弱指针已被删除,则抛出此值。你
std::weak_ptr是一种智能指针,它对被std::shared_ptr管理的对象存在非拥有性(“弱”)引用。在访问所引用的对象前必须先转换为std::shared_ptr。 std::weak_ptr用来表达临时所有权的概念: 当某个对象只有存在时才需要被访问,而且随时可能被他人删除时,可以使用std::weak_ptr来跟踪该对象。
为了解决循环引用的问题,可以使用std::weak_ptr,它可以避免形成循环引用,因为**std::weak_ptr不会增加引用计数**。只有当需要使用对象时,可以将std::weak_ptr转换成std::shared_ptr,如果对象已经被销毁,则转换会失败。 以下是使用std::weak_ptr改进上述代码的示例: ...
C++智能指针--weak_ptr,weak_ptr是对对象的一种弱引用,它不会添加对象的引用计数。weak_ptr和shared_ptr之间能够相互转换。shared_ptr能够直接赋值给week_ptr,week_ptr可通过调用lock函数来获得shared_ptr(假设对象已经被释放,则返回一个空的shared_ptr)。...