簡體   English   中英

shared_ptr:它用於什么

[英]shared_ptr: what's it used for

我在我的代碼中大量使用了boost :: scoped_ptr,它很棒,但我目前正在使用整個地方使用shared_ptr的軟件,我想知道我是否遺漏了一些東西。

AFAIK a shared_ptr僅在不同的線程要訪問相同的數據時才有用,並且您不知道線程將完成的順序(使用shared_ptr確保對象存在,直到最后一個線程完成它為止)。

還有其他用例嗎?

AFAIK a shared_ptr僅在不同線程要訪問相同數據時才有用

嗯,這適用於多個所有者擁有智能指針指向的相同對象的情況。 他們可以從不同的線程訪問智能指針,而shared_ptr也可以在該區域中使用,但這不是主要觀點。 如果最后一個所有者丟失了對指向的對象的引用,則shared_ptr機制將刪除該對象。

你可以使用scoped_ptr,如果你想擁有的是一個在創建它的范圍時被刪除的指針(通過異常, 轉到外部的地方,或者通過正常的控制流或其他機制)。 如果您這樣使用它,則無需更改為shared_ptr。

線程在這里無關緊要。 有意義的是,是否容易指定對象不再使用的點。

假設有幾個不同的對象想要使用同一個對象。 它可能是一組數據,或輸入/輸出,或某些幾何對象,或其他任何東西。 您希望在刪除所有使用對象后刪除共享對象,而不是之前的時鍾周期。 您可以使用shared_ptr強制執行此操作,而不是確定哪個擁有對象具有最長的生命周期(如果您更改程序或可能通過用戶交互,則可能會更改)。

使用對象是在相同還是不同的線程中無關緊要。 對象可能具有不可預測的生命周期,即使它們都在同一個線程中。

shared_ptr和scoped_ptr之間的另一個重要區別是,只有shared_ptr可以與weak_ptr一起使用。 弱指針用於打破共享指針的循環,從而避免內存泄漏,但weak_ptr可用於更多。

共享和弱指針可用於表示擁有和非擁有引用之間的差異。 數據的明確所有權會導致一個更清潔的設計,所以在可能的數據對象應該由一個其他對象通過一個shared_ptr所擁有。 所有其他對數據對象的長期引用都應該是弱指針,表示它們對數據的非所有權。 每次任何非擁有模塊訪問數據時,他們都需要將weak_ptr轉換為shared_ptr,此時他們可能會發現數據對象不再存在。 但是,當非擁有模塊訪問數據對象時,它們通過瞬態shared_ptr保持它,即使擁有對象要釋放數據,也要確保安全操作。

scoped_ptr和shared_ptr(和auto_ptr)之間的區別主要是復制語義。

  • scoped_ptr用於“ 資源分配是初始化 ”並且不可復制(不能與其他實例共享,並且無法傳輸所有權)
  • shared_ptr用於在多方之間共享時自動回收內存
  • auto_ptr是可復制的(並在分配時轉移所有權)

正如已經回答的那樣,shared_ptr是關於共享所有權的。 但是,我認為共享所有權通常是一件壞事(存在異常,例如flyweight模式),最好識別一個所有者並將scoped_ptr放在那里。

shared_ptr是一個引用計數的智能指針類型。 如果對象只有一個所有者(常見情況),則scoped_ptr是正確的解決方案。 如果對象可以在代碼的多個部分之間共享,那么shared_ptr將不會讓對象被破壞,直到所有對它的引用都被釋放。

暫無
暫無

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

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