如果乙個資源將被多層傳遞和訪問,那麼引數型別該用 weak ptr 還是 shared ptr?

時間 2021-05-30 00:43:32

1樓:chukun chen

如果你確定模組的生命週期比其它引用資源a的模組都要長,那應該用unique_ptr,並向外暴露資源a的裸指標或引用。如果模組的生命週期是不確定的,那就用shared_ptr,對我暴露weak_ptr,在子函式中以shared_ptr引用的方式傳遞。

2樓:

這個回答可以說是專門針對你這個場景的

c++是否應避免使用普通指標,而使用智慧型指標(包括shared,unique,weak)?

一句話概括就是下面這個回答

如果乙個資源將被多層傳遞和訪問,那麼引數型別該用 weak_ptr 還是 shared_ptr?

3樓:王賽

問題關鍵,並不是採用 shared_ptr 還是 weak_ptr,而是如何組織物件的生命週期管理。

從生命週期的管理上,shared_ptr 相當於做了乙個 ReadLockGuard。在這個 Guard 析構之前,這個物件就一定是可用的,不會被 Free。也就保證了,在 Guard 範圍內,能任意地使用 shared_ptr.

get() 出來的指標。

但是,既然是 Lock,就需要控制 Lock 的範圍。如果一直持有,就等於資源洩露;如果持有時間過長,會造成資源占用過久,浪費資源。更嚴重的是,如果有功能依賴物件析構,這個功能的執行可能阻塞過久。

weak_ptr 的作用,是用於輔助控制這個 Lock 的範圍,讓你有辦法減少 Lock 的持有時間和範圍。例如,下面乙個簡單的例子:

void

long_hold

(const

shared_ptr

&obj)

}void

short_hold

(const

shard_ptr

&obj)

sleep(1

);}}上面實現了兩個函式,long_hold () 在棧上持有了乙個 shared_ptr,Lock 的範圍是整個 long_hold 函式。在 long_hold 返回之前,物件不可能 Free。

short_hold() 在棧上持有的是 weakptr,這裡並不會建立 Lock。而是等到 while 迴圈中不停地臨時 Lock,使用完畢後立即釋放。注意,與 long_hold 不同的是,這個 Lock 範圍並不包含 sleep。

那麼,在 sleep 期間,外部的資源持有者就有機會執行 Free。

鋪墊了這麼多,下面說說我認為的一種適用範圍廣的實踐姿勢:

引數型別使用 const shared_ptr & 或 A *。如果函式內可能傳遞共享權,用 const shared_ptr &;否則,用 A *;

必須在乙個外部 shared_ptr (通常是在棧上)的保護下,傳遞 A* 或 const shared_ptr & 給函式做引數;

在呼叫函式中,根據目的,構造出 weak_ptr 或 shared_ptr 來傳遞共享權。

這樣實踐,一是,效能懲罰小,只在必需時構造 weak_ptr 和 shared_ptr;二是,引數型別能表明函式是否可能洩露共享權。

4樓:

既然題主的設計是

存在乙個模組,內含資源 a(型別為A),資源a 被乙個 shared_ptr 管理,這個 shared_ptr 全權管理資源a 的記憶體分配,其釋放操作也被封裝在模組內部。

那就應該用 unique_ptr。引數用裸指標或者引用。

5樓:暮無井見鈴

你應該先考慮所有權問題。模組(本應)獨佔資源的釋放權,卻給外部 shared_ptr ,是比較奇怪的事。這暗示著允許外部的 shared_ptr 把資源續一下。

考慮到 weak_ptr 能 lock (雖然不一定成功),給個 weak_ptr 也差不多奇怪……

我強烈懷疑模組的介面返回出來的東西就該是裸指標甚至是引用。當然是否適合這麼做,要看模組在什麼時機釋放掉資源。

在模組外部逐層傳遞的話,基本上傳裸指標或引用就行了。反正不跨執行緒的情況下不需要每層都觀察或者確保資源存在。但如果需要跨執行緒傳遞就是另一碼事了。

6樓:feverzsj

weak_ptr只是用於物件生命期不確定的情況,如果物件在使用時永遠可用,那麼直接返回物件引用就可以了,不用搞得這麼麻煩。

如果你是乙個外星文明,如何利用最少的資源毀滅人類文明

桌小布XXXL 把飛船停在曼哈頓上空,通知全人類 我是你們的神,耶路撒冷是我的聖城,誰先占領那裡,我就把科技全都教給他,而且讓他們永生不死。飛走,一年後再回來,地球就毀滅的差不多了 諧之言 以高於地球文明的水平創造 神蹟 肯定一部分科學,再否定另一部分,創造新的宗教,點歪地球的科技樹。用前面積累的影...

如果乙個男生和乙個女生在學習成績和能力上有差距,那他們在一起的可能性大嗎?

山芋大俠 在坐的各位 有物件的 有幾個和對方能力差不多的?如果能力都差不多 他們可能很容易走到一塊 但絕對沒有差很多就走不一塊的這種說法 伴侶之間適合最為重要 而不是能力相匹配 都什麼社會了 還在搞門當戶對?是不是太迂腐了啊 伴侶之間講究互補互助 這樣才能發展乙個好的生活 鄙人平生相信乙個緣字 世間...

如果乙個女生和乙個男生每天說自己平時的生活小事,男孩子會感到煩嘛?

墮落深淵 如果那個男孩是愛你或喜歡的,那只要是關於你的事,他都會很感興趣,如果是個不討厭你,不喜歡你道歉,那你多說乙個字都是很讓他討厭的。 阿拉華華 蝶戀星河 那要看這個男生喜不喜歡你,對你有沒有好感,如果有的話,那他巴不得聽你生活中的事,如果沒有的話,那他的確會感到煩,如果這個女生還死皮賴臉的給他...