第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

什么時候std :: weak_ptr有用?

什么時候std :: weak_ptr有用?

我開始研究C ++ 11的智能指針,但看不到任何有用的用法std::weak_ptr。有人可以告訴我什么時候std::weak_ptr有用/必要嗎?
查看完整描述

3 回答

?
眼眸繁星

TA貢獻(xiàn)1873條經(jīng)驗(yàn) 獲得超9個贊

一個很好的例子是緩存。

對于最近訪問的對象,您希望將其保留在內(nèi)存中,因此請牢牢指向它們。您會定期掃描緩存并確定最近未訪問過哪些對象。您不需要將它們保留在內(nèi)存中,因此可以擺脫強(qiáng)指針。

但是,如果該對象正在使用中,并且其他一些代碼持有指向該對象的強(qiáng)大指針怎么辦?如果緩存擺脫了指向?qū)ο蟮奈ㄒ恢羔槪瑒t它將再也找不到它。因此,高速緩存將微弱的指針指向需要查找的對象(如果它們恰好留在內(nèi)存中)。

這正是弱指針的作用-如果對象仍然存在,它可以讓您定位它,但是如果其他對象不需要它,則無法將其保留在對象周圍。


查看完整回答
反對 回復(fù) 2020-02-03
?
桃花長相依

TA貢獻(xiàn)1860條經(jīng)驗(yàn) 獲得超8個贊

std::weak_ptr是解決懸空指針問題的一種很好的方法。僅使用原始指針就不可能知道所引用的數(shù)據(jù)是否已被釋放。相反,通過std::shared_ptr管理數(shù)據(jù)并提供std::weak_ptr給數(shù)據(jù)用戶,用戶可以通過調(diào)用expired()或來檢查數(shù)據(jù)的有效性lock()。


您無法std::shared_ptr單獨(dú)做到這一點(diǎn),因?yàn)樗衧td::shared_ptr實(shí)例都共享在刪除所有實(shí)例之前都不會刪除的數(shù)據(jù)的所有權(quán)std::shared_ptr。這是如何使用來檢查懸空指針的示例lock():


#include <iostream>

#include <memory>


int main()

{

    // OLD, problem with dangling pointer

    // PROBLEM: ref will point to undefined data!


    int* ptr = new int(10);

    int* ref = ptr;

    delete ptr;


    // NEW

    // SOLUTION: check expired() or lock() to determine if pointer is valid


    // empty definition

    std::shared_ptr<int> sptr;


    // takes ownership of pointer

    sptr.reset(new int);

    *sptr = 10;


    // get pointer to data without taking ownership

    std::weak_ptr<int> weak1 = sptr;


    // deletes managed object, acquires new pointer

    sptr.reset(new int);

    *sptr = 5;


    // get pointer to new data without taking ownership

    std::weak_ptr<int> weak2 = sptr;


    // weak1 is expired!

    if(auto tmp = weak1.lock())

        std::cout << *tmp << '\n';

    else

        std::cout << "weak1 is expired\n";


    // weak2 points to new data (5)

    if(auto tmp = weak2.lock())

        std::cout << *tmp << '\n';

    else

        std::cout << "weak2 is expired\n";

}


查看完整回答
反對 回復(fù) 2020-02-03
?
ABOUTYOU

TA貢獻(xiàn)1812條經(jīng)驗(yàn) 獲得超5個贊

另一個答案,希望更簡單。(對于其他Google員工)


假設(shè)您有Team和Member對象。


顯然,這是一種關(guān)系:Team對象將具有指向的指針Members。而且成員也可能有指向其Team對象的后向指針。


然后,您將有一個依賴周期。如果使用shared_ptr,則放棄引用時將不再自動釋放對象,因?yàn)樗鼈円匝h(huán)方式相互引用。這是內(nèi)存泄漏。


您可以使用來打破這一點(diǎn)weak_ptr?!八姓摺蓖ǔJ褂胹hared_ptr與“擁有”使用weak_ptr它的父,并將其轉(zhuǎn)換暫時到shared_ptr時,它需要訪問它的父。


存儲一個弱ptr:


weak_ptr<Parent> parentWeakPtr_ = parentSharedPtr; // automatic conversion to weak from shared

然后在需要時使用它


shared_ptr<Parent> tempParentSharedPtr = parentWeakPtr_.lock(); // on the stack, from the weak ptr

if( !tempParentSharedPtr ) {

  // yes, it may fail if the parent was freed since we stored weak_ptr

} else {

  // do stuff

}

// tempParentSharedPtr is released when it goes out of scope


查看完整回答
反對 回復(fù) 2020-02-03
  • 3 回答
  • 0 關(guān)注
  • 1130 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號