軟考程序員輔導:C++內存泄漏的解決辦法
1、Parent對象。
每一個對象,都要有唯一的parent,當parent析構時,要帶動他所有的children析構。
好處:
實現(xiàn)簡單,且具有邏輯性。
比如:一個窗口,他的按鍵,就應該是這個窗口的children,當窗口析構的時候,按鍵也必須析構。
壞處:
不可以有復制構造函數(shù)……
這個也很好理解。A-->B-->C中,a是b的parent,b是c的parent,如果允許復制,B復制了個D,那C就有兩個parent,究竟怎么析構呢?
開源庫的實現(xiàn):
Qt實現(xiàn)了這種方式的內存管理,尤其是對GUI框架,十分適用。
2、引用計數(shù)的SharedPtr
指針,進行復制操作的時候,引用計數(shù)+1,析構的時候引用計數(shù)-1,當引用計數(shù)為0的時候,釋放空間。
好處:
實現(xiàn)簡單
壞處:
具有循環(huán)引用的情況。要引入WeakPtr
開源庫的實現(xiàn):
Qt同時實現(xiàn)了這種技術,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)垃圾回收。初始化一個內存池,當內存池滿的時候,進行垃圾回收操作。
好處:
一勞永逸
壞處:
實現(xiàn)困難。
占用內存大。
對已有的環(huán)境,不一定會有很好的支持。
開源庫的實現(xiàn):
python和java都有垃圾回收的實現(xiàn),可以進行參考。
評述:
內存池也許不一定要做垃圾回收,如果是靜態(tài)的內存池,可以加速內存分配的過程。