簡體   English   中英

當boost :: shared_ptr可能沒有被釋放?

[英]When a boost::shared_ptr might not be freed?

閱讀此主題C ++面試准備 (馬特的答案)后,我有一個關於boost :: shared_ptr的問題。 shared_ptr是否真的有可能泄漏內存? 怎么樣?

shared_ptr使用引用計數,這意味着循環引用可能導致泄漏。 具體來說:

struct A {
    shared_ptr<A> other;
};

shared_ptr<A> foo() {
    shared_ptr<A> one(new A);
    shared_ptr<A> two(new A);
    one->other = two;
    two->other = one;
    return one;
}

如果沒有人工干預(將other指針之一都設置為NULL),則foo返回的數據結構將永遠不會被釋放。

現在,這只是每個程序員都應該知道的事實。 越有趣的訪談對話是如何處理的。 選項包括:

  • 重新設計數據結構,因此不需要指針周期;
  • 在每個周期中至少將一個指針降級為非所有者引用(裸指針或weak_ptr );
  • 專用的循環收集器 ;
  • 作為最后的選擇,在適當的位置手動使指針為空(這會破壞異常安全性)。

通函; 引用計數垃圾收集器中的一個常見問題。

我建議您閱讀以下內容: http : //www.codeproject.com/KB/stl/boostsmartptr.aspx#Cyclic References

shared_ptr是一種引用計數機制。 一個帶有引用計數的陷阱是您可以擁有一個沒有其他人引用的循環引用鏈。 除非有一種“打破鏈條”的機制,否則您的鏈條永遠不會被釋放。

暫無
暫無

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

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