天天看點

對log4cpp-1.0兩處記憶體洩露的修改

第一處

Appender中的Appender::AppenderMap* Appender::_allAppenders通過_getAllAppenders函數初始化之後就沒有任何代碼将其釋放,導緻記憶體洩露。

對log4cpp-1.0兩處記憶體洩露的修改

    Appender :: AppenderMap &  Appender :: _getAllAppenders() {

對log4cpp-1.0兩處記憶體洩露的修改

         if  ( ! _allAppenders) 

對log4cpp-1.0兩處記憶體洩露的修改

            _allAppenders  =   new  Appender :: AppenderMap();

對log4cpp-1.0兩處記憶體洩露的修改
對log4cpp-1.0兩處記憶體洩露的修改

         return   * _allAppenders;

對log4cpp-1.0兩處記憶體洩露的修改

    }

解決方法是在Appender中加入一下靜态成員函數

對log4cpp-1.0兩處記憶體洩露的修改

    void Appender :: shutdownClear() {

對log4cpp-1.0兩處記憶體洩露的修改

         if (_allAppenders) {

對log4cpp-1.0兩處記憶體洩露的修改

            _deleteAllAppenders();

對log4cpp-1.0兩處記憶體洩露的修改

            delete _allAppenders;

對log4cpp-1.0兩處記憶體洩露的修改

            _allAppenders  =   NULL ;

對log4cpp-1.0兩處記憶體洩露的修改

        }

對log4cpp-1.0兩處記憶體洩露的修改

    }

再在HierarchyMaintainer中加入一下代碼

對log4cpp-1.0兩處記憶體洩露的修改

    HierarchyMaintainer :: HierarchyMaintainer() {

對log4cpp-1.0兩處記憶體洩露的修改

        register_shutdown_handler(Appender :: shutdownClear);

對log4cpp-1.0兩處記憶體洩露的修改

    }

在調用Category的靜态函數shutdown時,會調用HierarchyMaintainer的shutdown,HierarchyMaintainer的shutdown會調用Appender::shutdownClear,進而将資源釋放掉。

第二處

在MSThreads.hh中的ThreadLocalDataHolder的析構函數沒有将_key所指的資源釋放掉,而隻是将_key釋放掉,導緻記憶體洩露。

解決方法,在析構函數中調用reset函數

對log4cpp-1.0兩處記憶體洩露的修改

 inline  ~ ThreadLocalDataHolder() {

對log4cpp-1.0兩處記憶體洩露的修改

     reset ();

對log4cpp-1.0兩處記憶體洩露的修改

    TlsFree(_key);

對log4cpp-1.0兩處記憶體洩露的修改

};

最後

這兩處是我在用VC2005寫MFC代碼是發現的,因為afx.h中開啟了記憶體檢測功能,是以一運作玩程式,就能在Output視窗中看到記憶體洩露資訊。我就很奇怪,log4cpp他們就不在MFC下測試一下的嗎?會英語的,寫MFC代碼的難道就都沒發現(我不懂英語,就不跟他們交流了)?奇怪。。。