簡體   English   中英

用於將weak_ptr應用於unique_ptr的內容

[英]Use for applying weak_ptr to contents of unique_ptr

我正在嘗試理解c ++ 11中帶來的unique_ptrshared_ptrweak_ptr

我聽說weak_ptr對於緩存,打破周期等等都很好。 我聽說他們與shared_ptrs配合得很好。

但在這方面, shared_ptrsunique_ptrs之間的區別是什么? 為什么weak_ptr只能與一個而不是另一個一起使用? 為什么我不想對其他人擁有的東西進行弱引用?

從技術上講, weak_ptr是一種掛起管理某個共享對象的一組shared_ptr的引用計數器的方法。 當最后一個shared_ptr被銷毀時,對象被銷毀,但只要有weak_ptr ,它的引用計數器就會存在。 因此,通過任何仍然存在的weak_ptr您可以檢查對象是否仍然存在,或者是否已被銷毀。

如果它仍然存在,那么從weak_ptr可以獲得一個允許您引用該對象的shared_ptr

這主要用於打破周期。

特別是,一個對象可以包含一個持有其自己的引用計數器的weak_ptr ,它允許您從對象本身獲取對象的shared_ptr 也就是說, shared_ptr使用與該對象的其他shared_ptr相同的引用計數器。 這就是enable_shared_from_this工作原理。

unique_ptr沒有任何引用計數器,因此掛起那個不存在的引用計數器是沒有意義的。

弱指針的主要觀點是你可以嘗試使指針變強,即擁有:

auto strongPtr = weakPtr.lock();

if (strongPtr)
{
    // still existed, now have another reference to the resource
}
else
{
    // didn't still exist
}

注意第一條路徑: 強弱指針要求我們取得對象的所有權

這就是使用unique_ptr沒有意義的原因:使弱指針變強的唯一方法是從其他地方獲取資源,而對於unique_ptr意味着將其留在其他地方並帶有意外的空指針。 shared_ptr得到一個傳遞,因為它實際上意味着共享它。

我也是C ++ 11的新手,所以如果有人知道的話,我會很感激任何更正。

我認為沒有太多理由,否則,你會使用shared_ptr因為它會unique_ptr的整個目的。 unique_ptr隱含了語義,它可以完全控制它指向的對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM