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