程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> [C++11]_[初級]_[weak_ptr的使用場景]

[C++11]_[初級]_[weak_ptr的使用場景]

編輯:C++入門知識

[C++11]_[初級]_[weak_ptr的使用場景]


場景

弱引用特性,不擁有對象,只有延遲到嘗試調用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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved