std::weak_ptr 可以从一个 std::shared_ptr 或另一个 std::weak_ptr 创建。它持有一个指向 std::shared_ptr 控制块的指针,但不增加对象的引用计数。当所有的 std::shared_ptr 都被销毁时,对象也会被销毁,此时 std::weak_ptr 会变为空(expired)。
演示如何用 expired 检查指针的有效性。 运行此代码 #include <iostream> #include <memory> std::weak_ptr<int> gw; void f() { if (!gw.expired()) std::cout << "gw 有效\n"; else std::cout << "gw 已过期\n"; } int main() { { auto sp = std::make_shared<int>(42); gw = ...
std::weak_ptr<T>::expired boolexpired()constnoexcept; (C++11 起) 等价于use_count()==0。可能仍未对被管理对象调用析构函数,但此对象的析构已经临近(或可能已发生)。 参数 (无) 返回值 若被管理对象已被删除则为true,否则为false。 注意
#include <iostream> #include <memory> std::weak_ptr<int> gw; void f() { if (!gw.expired()) { std::cout << "gw is valid\n"; } else { std::cout << "gw is expired\n"; } } int main() { { auto sp = std::make_shared<int>(42); gw = sp; f(); } f(); } 输出...
悬挂的std::weak_ptr被称为失效的(expired)。你能直接检查它: if(wpw.expired())...//如果wpw不指向一个对象 但是为了访问std::weak_ptr指向的对象,你常常需要检查看这个std::weak_ptr是否已经失效了或者还没有失效(也就是,它没有悬挂)。想法总是比做起来简单,因为std::weak_ptr没有解引用操作,所以没办...
#include <iostream>#include <memory>std::weak_ptr<int>gw;voidf(){if(!gw.expired())std::cout<<"gw is valid\n";elsestd::cout<<"gw is expired\n";}intmain(){{autosp=std::make_shared<int>(42);gw=sp;f();}f();} Output: ...
和正常情况下我们判断一个指针是否为空类似, 我们使用expired()判断weak_ptr指针是否还能使用. 如果可以使用, 我们使用lock临时获取指针的所有权, 然后进行操作. 执行结果如下所示: 可以看到, 在被销毁之前, 产品可以正常工作. 一旦被销毁, 产品的析构函数就被调用, weak_ptr也被认为expired了, 于是就无法使用了...
悬空的std::weak_ptr被称作已经expired(过期)。你可以用它直接做测试: if (wpw.expired()) … //如果wpw没有指向对象… 但是通常你期望的是检查std::weak_ptr是否已经过期,如果没有过期则访问其指向的对象。这做起来可不是想着那么简单,主要两方面
基于以上事实可知,可通过weak_ptr::expired()函数判断其跟踪的shared_ptr是否已被释放。 引用计数类 // CLASS _Ref_count_base class _Ref_count_base { // common code for reference counting private: virtual void _Destroy() = 0; virtual void _Delete_this() = 0; ...
if (!weak_foo2.expired()) { // 如果要获取数据指针,需要通过lock接口获取 weak_foo2.lock()->method(); } std::shared_ptr<foo> tmp = weak_foo2.lock(); // 我们这边有尝试多次获取所有权(lock),看一下引用计数个数 std::cout << "shptr_foo2 RefCount: " << weak_foo2.lock().use_co...