再论C++之垃圾回收(GC)
生活随笔
收集整理的這篇文章主要介紹了
再论C++之垃圾回收(GC)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
再論C++之垃圾回收(GC)
使用智能指針(smart pointers)
- http://www.codeproject.com/cpp/garbage_collect.asp
- 原理:基于引用計數(reference count)。
這種垃圾回收(gc)算法無非都是給每一塊分配的內存提供引用計數,然后通過智能指針(smart pointer)自動完成引用計數的加減,如果引用技術減少到零,就代表沒有人使用該內存了,這塊內存就可以回收了。
如果可以正確的遵從這種gc的使用規則,也就是說你可以正確無誤的使用智能指針,那么理論上來說,就不可能存在內存泄漏。
? 但是現實并不象想象的那么單純,那么美好。一方面,智能指針的概念仍然沒有被C++社區廣泛的理解應用,而且智能指針種類繁多,各有各的規則,在代碼量多了的時候,有時存在這樣那樣的失誤難免;另一方面(應該是更加令人為難的一點),并不是所有人都那么喜歡用智能指針,而且原生指針的使用很多情形下避無可避,我們不得不在原生指針與智能指針之間進行轉換。
? 所以這樣的gc的最終結果是,掌握引用計數的規則最終似乎比掌握new/delete的規則容易不了多少,有時甚至讓新接觸該技術的程序員感到畏懼。另外,引用計數的引入,出乎意料的產生了一個負作用:調試內存泄漏變得比原先困難多了。
? 所以引用計數和智能指針實現的gc不能從根本上解決內存泄漏問題。
真正的垃圾回收(garbage collector)
- 請注意,C++并非不支持GC。我們知道BN一直強調的是,GC是C++的可選組件,不是必需的。
- 這里是C++的GC相關代碼以及文檔:
- C++/CLI(Microsoft的托管C++)
- http://www.hpl.hp.com/personal/Hans_Boehm/gc/?(不少人用這個GC來進行開發)
- http://www.devarticles.com/c/a/Cplusplus/A-Simple-Garbage-Collector-for-C-plus-plus/
- http://cybertiggyr.com/gene/garbage-collection-cpp/
?
- 評價:如果你的系統很單純,采用這個是不錯的主意。因為這意味著你的C++語言已經和Java、C#沒有任何區別。但是請注意,這要求你的系統是純粹的,也就是說:
?
- 你沒有是使用第三方代碼。或者,你的第三方代碼中,內存也是托管的(通過GC創建出來的)。
? - 小心與那些你無法取得源代碼的DLL(例如,Win32 API/你購買的第三方組件)打交道。與C#一樣,你需要小心,不要讓你的程序出現Win32 API還在訪問數據,而被GC回收的情形。不過這種情況在C++中比C#要好得多:畢竟在C++中,你對GC的控制能力遠遠強于C#。
? - 特別地、如果你使用了COM,那么你將很痛苦:因為COM基于引用計數來管理對象生命周期,這意味著GC基本上對其無能為力。除非你像C#一樣,為每個COM組件提供一個Wrapper。
- 你沒有是使用第三方代碼。或者,你的第三方代碼中,內存也是托管的(通過GC創建出來的)。
補充:
- 由于GC依賴語言的自省(reflection)能力,而C++這方面的能力無疑相當得弱,因此C++中的GC是尷尬的。
- 請注意,GC是排他的,這意味著兩個GC不能在一起工作。因此,除非C++標準規定了必須使用那個GC,不然托管的C++代碼,存在著交流困難。
?
支持垃圾回收的allocator(gc allocator)
- 代碼與文檔:
- C++內存管理變革
- AutoFreeAlloc(最袖珍的垃圾回收器)
- boost::object_pool?(注意,boost::pool不屬于gc allocator,而只能說屬于allocator)
- 待續...
- 評價:半自動的垃圾回收,比GC簡單、高效、容易控制。
總結
以上是生活随笔為你收集整理的再论C++之垃圾回收(GC)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: esp32树莓派_用 ESP32 制造炫
- 下一篇: 用VC写Assembly代码