天天看点

对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代码的难道就都没发现(我不懂英语,就不跟他们交流了)?奇怪。。。