[英]reference counting with cycles in C++ smart pointer
在shared_ptr智能指針中,使用引用計數。 但是,引用計數有一個問題,它不能打破引用循環。
關於這個問題,我有四個問題。
1)有人可以給我一個片段,其中參考周期發生了嗎?
2)如果不能打破參考周期,RCSP如何保證成功資源管理? 有沒有辦法打破第三方產品的周期?
3)無論如何都要避免參考周期?
4)其他智能指針怎么樣? 他們如何處理源管理? 例如,share_ptr,scope_ptr?
非常感謝!
避免循環的通常方法是在循環的任何一個點使用弱引用。 shared_ptr
有一個伴隨類型weak_ptr
,它是為此目的而設計的。
削弱周期的哪一部分是設計問題。 在“父”對象擁有“子”的設計中,從父級到子級的引用應該是強的( shared_ptr
),並且從子級到父級的引用應該是弱的( weak_ptr
)。
涉及周期的實際用途是相當多的圖形。 一個微不足道的片段(雖然在現實生活中不太可能發生)將是這樣的:
struct node {
node *next;
};
int create_cycle() {
node *a = new node;
a.next = a;
}
在create_cycle返回之后,我們剛剛分配的節點包含對它自己的引用,但沒有其它指向它,因此引用計數器即使它是垃圾也不會收集它。
Chris Jester-Young已經從實用的角度處理了智能指針的循環中斷。 盡管如此,他並沒有詳細介紹它的內部工作原理。
weak_ptr是一種雙重間接指針。 即weak_ptr不直接提供對象的訪問。 相反,要訪問該對象,您必須將weak_ptr轉換為shared_ptr,然后使用它來獲取該對象 - 但是,如果仍然至少有一個其他shared_ptr,那么將weak_ptr轉換為shared_ptr的嘗試將只會成功托管對象(因此該對象具有非零引用計數且仍然存在)。
因此,weak_ptr允許您訪問對象,只要它存在,但“知道”對象何時不再存在,並且不允許您訪問(如果已釋放的)內存,如果對象曾經是對象已被摧毀。
避免周期取決於您正在使用的各種事物。 如果你經常處理圖表(例如),他們通常幾乎無法避免,只是因為你建模的東西有很多周期。 否則,嗯......這取決於。 我猜想有相當數量的開發人員已經完成了整個職業生涯,而無需創建包含循環的鏈接結構。 其他人平均每周可能會多次這樣做。
就其他智能指針而言,如上所述,weak_ptr類型與shared_ptr一起使用; 你可以在不使用weak_ptr的情況下使用shared_ptr,但是為了在某些時候真正使用weak_ptr,你必須將它轉換為shared_ptr。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.