noexcept{returnblock_->weak_count.load();}private:structControlBlock{std::atomic<std::int64_t>count;std::atomic<std::int64_t>weak_count;T*ptr;};voidrelease()noexcept{block_->count.fetch_sub(1);if(block_->count<=0){if(block_->ptr){deleteblock_->ptr;block_->ptr=nullptr;}if(block_...
一种形式是std::weak_ptr::lock,返回一个std::shared_ptr,过期则std::shared_ptr为空。 std::weak_ptr防止环形引用 std::shared_ptr<Widget>spw1=wpw.lock();//如果wpw过期,spw1就为空autospw2=wpw.lock();std::shared_ptr<Widget>spw3(wpw);//如果wpw过期,抛出std::bad_weak_ptr异常 有三种选择:...
此函数和 std::shared_ptr 的构造函数可能获得 std::weak_ptr 所指向的被管理对象的临时所有权。区别是 std::shared_ptr 的构造函数在其 std::weak_ptr 为空时抛异常,而 std::weak_ptr<T>::lock() 构造空的 std::shared_ptr<T>。 示例运行此代码 #include <iostream> #include <memory> void ...
weak_ptr<T> W//空weak_ptr 可以指向为T的对象weak_ptr<T> W(sp)//与shared_ptr sp 指向相同对象 weak_ptrw= p//P可以是share_ptr 或weak_ptrw.reset()//w 为空w.use_count//与w共享对象的shared_ptr竖向w.expired()//w.use_count() 为0 ,返回true,否则返回为falsew.lock()//如果expired ...
weak_ptr在引用对象时,不增加引用计数值(所以叫虚引用)。既然不增加计数值,那么在引用之后,被指对象可能被释放了,所以不能直接读取weak_ptr中引用的对象。在使用对象之前必须先检查所引用的对象是否已经被释放,如果没有,则需要将引用计数值加1,然后访问此对象,访问完之后,再将引用计数值减1。由此可见,使用shared_...
std::weak_ptr<T>:: Create account std::weak_ptr<T>::lock std::shared_ptr<T>lock()constnoexcept; (since C++11) Creates a newstd::shared_ptrthat shares ownership of the managed object. If there is no managed object, i.e.*thisis empty, then the returnedshared_ptralso is empty....
#include <iostream> #include <memory> std::weak_ptr<int> gw; void observe() { std::cout << "gw.use_count() == " << gw.use_count() << ": "; // 使用之前必须制作一个 shared_ptr 副本 if (std::shared_ptr<int> spt = gw.lock()) std::cout << "*spt == " << *spt <...
weak_ptr,share的小弟,可以和shared_ptr共享同一个对象,但不会纳入持有者计数,并且在shared_ptr指向对象被释放后,指针自动归空,所以使用前需要有个检测; unique_ptr,和shared不同,显现独占式的特点,同一时间只有一个拥有,一旦更换指向对象,原有对象被销毁,对应资源就会被释放。
C++11的智能指针: weak_ptr // weak_ptr: 它指向shared_ptr指针所指向的对象内存, 但却不拥有该内存, 因此它的构造和析构不会引起引用计数的变化 // 实现上: 它没有重载*和->, 但可以用lock获得一个可用的 shared_ptr 对象 // 执行lock(), 会返回其对应的 shared_ptr 对象( 若内存无效时则返回nullptr...
weak_ptr(constweak_ptr&r)noexcept; (2)(since C++11) template<classY> weak_ptr(constweak_ptr<Y>&r)noexcept; (2)(since C++11) template<classY> weak_ptr(conststd::shared_ptr<Y>&r)noexcept; (2)(since C++11) weak_ptr(weak_ptr&&r)noexcept; ...