簡體   English   中英

C ++智能指針中帶循環的引用計數

[英]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.

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