2009-12-25 43 views

回答

5

使用引用計數的指針,如boost::shared_ptr。不需要對指向類的更改,但是您將被限制爲動態創建類實例。

+0

謝謝,但我不想使用任何庫。 – Ashish 2009-12-25 20:38:50

+2

如果不使用庫,則無法使用C++。但是您可以簡單地將Boost源複製到您的項目中。 – 2009-12-25 20:42:15

+0

如果你是引用計數,你總是會使用新的 – doron 2009-12-25 21:58:49

1

Wikipedia article on referencing counting指出它比我能:

引用計數超過追查垃圾收集的主要優點是,對象只要他們不再被引用的回收,並以漸進的方式,沒有長時間的收集週期和明確定義的每個對象的生命週期。在實時應用程序或內存有限的系統中,這對於保持響應速度很重要。引用計數也是實現垃圾收集的最簡單形式之一。它還可以有效管理非內存資源,例如操作系統對象,這些內存往往比內存稀少(追蹤GC系統使用終結器,但延遲迴收可能會導致問題)。加權引用計數對於垃圾收集分佈式系統是一個很好的解決方案。

如果一組活動對象填充大部分可用內存,則會經常觸發跟蹤垃圾回收循環;它需要額外的空間才能高效。隨着可用空間總量的減少,引用計數性能不會降低。 1

引用計數也是有用的信息,可用作其他運行時優化的輸入。例如,嚴重依賴諸如許多函數式編程語言之類的不可變對象的系統可能由於頻繁的副本而受到效率損失。但是,如果我們知道一個對象只有一個引用(就像在很多系統中一樣),並且該引用在創建類似的新對象的同時丟失(如字符串附加語句str←str +「a」 ),我們可以用原始對象上的突變來替換操作。在天真的形式

引用計數擁有追蹤垃圾收集兩個主要的缺點,兩者都需要額外的機制來改善:

  • 它涉及到頻繁更新是效率低下的一個來源。雖然跟蹤垃圾收集器可以通過上下文切換和緩存線故障嚴重影響效率,但它們收集的次數相對較少,而訪問對象則不斷進行。另外,不太重要的是,引用計數要求每個內存管理對象爲引用計數預留空間。在跟蹤垃圾回收器時,儘管跟蹤垃圾回收器,尤其是增量回收器,可能需要額外的空間用於其他目的,但該信息隱式存儲在引用該對象的引用中,節省了空間。
  • 上面介紹的樸素算法不能處理引用循環,即直接或間接引用自身的對象。完全依賴於引用計數的機制將永遠不會考慮循環的要刪除的對象鏈,因爲它們的引用計數保證爲非零。處理這個問題的方法存在,但也會增加引用計數的開銷和複雜性 - 另一方面,這些方法只需要應用於可能形成循環的數據,通常是所有數據的一小部分。一種這樣的方法是使用弱引用。
2

創建一個繼承自庫的類並在子類中實現引用計數的子類。

0

正如Jim Bruck所說,擴展是一種機制。如果擴展不可行,那麼您可以使用委託包裝方法。