std::weak_ptr 的expired 成员函数用于检查该 weak_ptr 是否已经过期,即它所观察的对象是否已经被销毁。如果返回 true,则表示 weak_ptr 已经过期,不再指向有效的对象;如果返回 false,则表示 weak_ptr 仍然有效,可以安全地访问它所指向的对象(通过 lock 方法)。
// std_tr1__memory__weak_ptr_expired.cpp // compile with: /EHsc #include <memory> #include <iostream> struct deleter { void operator()(int *p) { delete p; } }; int main() { std::weak_ptr<int> wp; { std::shared_ptr<int> sp(new int(10)); wp = sp; std::cout << "wp...
static_pointer_cast Function swap Function weak_ptr Class weak_ptr Class weak_ptr::element_type weak_ptr::expired weak_ptr::lock weak_ptr::operator= weak_ptr::reset weak_ptr::swap weak_ptr::use_count weak_ptr::weak_ptr _DO_NOT_DECLARE_INTERLOCKED_INTRINSICS_IN_MEMORY MacroLearn...
expired():判断当前weak_ptr指针为否过期(指针为空,或者指向的堆内存已经被释放)。 lock():如果当前weak_ptr已经过期,则该函数会返回一个空的shared_ptr指针;反之,该函数返回一个和当前weak_ptr指向相同的shared_ptr指针。 示例程序 #include<iostream>#include<memory>voidobserve(std::weak_ptr<int> weak){if...
weak_ptr提供了一个成员函数expired()来判断所指对象是否已经被释放。如果所指对象已经被释放,expired()返回true,否则返回false。 程序示例: std::shared_ptr<int>sp1(newint(22));std::shared_ptr<int> sp2 = sp1;std::weak_ptr<int> wp = sp1;// point to sp1std::cout<<wp.use_count()<<std::en...
expired函数 获取指针 cyclic reference例子 概述 shared_ptr的作用主要是在最后一个指向资源的shared_ptr销毁时自动释放资源,然而在某些场景下这种行为可能不被期望。例如: 两个或者多个对象都使用shared_ptr,并且相互通过shared_ptr指向对方,如果存在一个环路(cyclic reference),那么由于环路上的shared_ptr的use_count最...
#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 = sp; f(); } f(); } 输出: gw 有效 gw 已...
weak_ptr提供了一个成员函数expired()来判断所指对象是否已经被释放。如果所指对象已经被释放,expired()返回true,否则返回false。 程序示例: std::shared_ptr<int>sp1(newint(22));std::shared_ptr<int>sp2=sp1;std::weak_ptr<int>wp=sp1;// point to sp1std::cout<<wp.use_count()<<std::endl;// ...
// std::weak_ptr<SomeClass> wp{ sp }; if (!wp.expired()) { wp.lock()->DoSomething(); } 正确的做法是: auto sp = wp.lock(); if (sp) { sp->DoSomething(); } std::weak_ptr的lock函数是一个原子操作。有趣的是,最开始的C++11标准是没有提到原子操作的,C++14标准才对这一点进...
从上面代码中,ClassA和ClassB间存在着循环引用,从运行结果中我们可以看到:当main函数运行结束后,spa和spb管理的动态资源并没有得到释放,产生了内存泄露。 为了解决类似这样的问题,C++11引入了weak_ptr,来打破这种循环引用。 2、weak_ptr是什么? weak_ptr 是为了配合 shared_ptr 而引入的一种智能指针,它指向一个...