欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

[C++11]_[初级]_[weak_ptr的使用场景]

程序员文章站 2022-05-13 16:32:25
场景 弱引用特性,不拥有对象,只有延迟到尝试调用Lock()时才会有可能临时拥有对象: 只是持有一个没有拥有权的被shared_ptr托管的对象. 只有调用lock()创建sh...

场景

弱引用特性,不拥有对象,只有延迟到尝试调用Lock()时才会有可能临时拥有对象:
只是持有一个没有拥有权的被shared_ptr托管的对象. 只有调用lock()创建shared_ptr指针时才会引用实际对象. 在lock()成功时会延长shared_ptr对象的生命周期,因为它递增了一个引用计数. 在shared_ptr主指针结束后,如果std::weak_ptr的lock()成功的指针还存在,那么这时候还有lock()的代码调用,引用计数仍然递增. 经常用在解除循环引用问题.看以下例子如果Man和Woman各自包含一个std::shared_ptr,那么就会出现内存泄漏,因为Woman,Main的计数实际是2.Woman成员变量是必须是Woman的析构调用后才会调用,而Woman的析构必须是引用计数为0时才会调用,这导致成员变量Man一直没有析构.
例子1:std::shared_ptr 和 std::weak_ptr的用法以及引用计数的循环引用问题 用于在延迟使用主导权的场景, 比如线程A是重要,A完成之后B,C线程可做可不做.这时候B,C就可以使用weak_ptr指针来控制.

参考

std::weak_ptr

例子2

#include 
#include 

std::weak_ptr gw;

void f()
{
    if (auto spt = gw.lock()) { // Has to be copied into a shared_ptr before usage
    std::cout << *spt << "\n";
    }
    else {
        std::cout << "gw is expired\n";
    }
}

void TestWeakPtrScope_1()
{
    std::cout << "TestWeakPtrScope_1" << std::endl;
    std::shared_ptr sp1;
    {
        auto sp = std::make_shared(42);
        gw = sp;

        f();
        sp1 = gw.lock();
    }
    f();
}

void TestWeakPtrScope_2()
{
    std::cout << "TestWeakPtrScope_2" << std::endl;
    std::shared_ptr sp1;
    {
        auto sp = std::make_shared(42);
        gw = sp;

        f();
    }
    f();
}

int main()
{
    TestWeakPtrScope_1();
    TestWeakPtrScope_2();
}

输出:

TestWeakPtrScope_1
42
42
TestWeakPtrScope_2
42
gw is expired