軟考程序員輔導:C++內(nèi)存泄漏的解決辦法
1、Parent對象。
每一個對象,都要有唯一的parent,當parent析構(gòu)時,要帶動他所有的children析構(gòu)。
好處:
實現(xiàn)簡單,且具有邏輯性。
比如:一個窗口,他的按鍵,就應該是這個窗口的children,當窗口析構(gòu)的時候,按鍵也必須析構(gòu)。
壞處:
不可以有復制構(gòu)造函數(shù)……
這個也很好理解。A-->B-->C中,a是b的parent,b是c的parent,如果允許復制,B復制了個D,那C就有兩個parent,究竟怎么析構(gòu)呢?
開源庫的實現(xiàn):
Qt實現(xiàn)了這種方式的內(nèi)存管理,尤其是對GUI框架,十分適用。
2、引用計數(shù)的SharedPtr
指針,進行復制操作的時候,引用計數(shù)+1,析構(gòu)的時候引用計數(shù)-1,當引用計數(shù)為0的時候,釋放空間。
好處:
實現(xiàn)簡單
壞處:
具有循環(huán)引用的情況。要引入WeakPtr
開源庫的實現(xiàn):
Qt同時實現(xiàn)了這種技術(shù),Boost也有相關實現(xiàn)。
我因為最近想自己實現(xiàn)一套Signalandslot庫,也實現(xiàn)了SharedPtr,開源。
地址:/raylib/raylib/blobs/master/SmartPtr.hpp
評述:
這是C++中最通用的實現(xiàn)手段,如果你要做一套類庫,嘗試使用SharedPtr,會讓事情變得更加簡單。
3、重載new,實現(xiàn)GC
直接重載C++操作符,實現(xiàn)垃圾回收。初始化一個內(nèi)存池,當內(nèi)存池滿的時候,進行垃圾回收操作。
好處:
一勞永逸
壞處:
實現(xiàn)困難。
占用內(nèi)存大。
對已有的環(huán)境,不一定會有很好的支持。
開源庫的實現(xiàn):
python和java都有垃圾回收的實現(xiàn),可以進行參考。
評述:
內(nèi)存池也許不一定要做垃圾回收,如果是靜態(tài)的內(nèi)存池,可以加速內(nèi)存分配的過程。