2012軟考程序員輔導:C++內(nèi)存泄漏的解決辦法

字號:

發(fā)現(xiàn)大家對寫庫很熱衷。不過,寫一個庫,用C++最麻煩的事情,就是你new完了要記著delete。不過,這么傻瓜化的操作,有沒有辦法讓電腦自動完成呢?當然是可以的。思路有以下三點:
    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也有相關(guān)實現(xiàn)。
    我因為最近想自己實現(xiàn)一套Signalandslot庫,也實現(xiàn)了SharedPtr,開源。
    地址:http://gitorious.org/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)存分配的過程。