3 回答

TA貢獻(xiàn)1873條經(jīng)驗(yàn) 獲得超9個贊
一個很好的例子是緩存。
對于最近訪問的對象,您希望將其保留在內(nèi)存中,因此請牢牢指向它們。您會定期掃描緩存并確定最近未訪問過哪些對象。您不需要將它們保留在內(nèi)存中,因此可以擺脫強(qiáng)指針。
但是,如果該對象正在使用中,并且其他一些代碼持有指向該對象的強(qiáng)大指針怎么辦?如果緩存擺脫了指向?qū)ο蟮奈ㄒ恢羔槪瑒t它將再也找不到它。因此,高速緩存將微弱的指針指向需要查找的對象(如果它們恰好留在內(nèi)存中)。
這正是弱指針的作用-如果對象仍然存在,它可以讓您定位它,但是如果其他對象不需要它,則無法將其保留在對象周圍。

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";
}

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
- 3 回答
- 0 關(guān)注
- 1130 瀏覽
添加回答
舉報(bào)