对log4cpp-1.0两处内存泄露的修改

第一处

Appender中的Appender::AppenderMap* Appender::_allAppenders通过_getAllAppenders函数初始化之后就没有任何代码将其释放,导致内存泄露。

    Appender :: AppenderMap &  Appender :: _getAllAppenders() {
        
if  ( ! _allAppenders) 
            _allAppenders 
=   new  Appender :: AppenderMap();

        
return   * _allAppenders;
    }

解决方法是在Appender中加入一下静态成员函数

    void Appender :: shutdownClear() {
        
if (_allAppenders) {
            _deleteAllAppenders();
            delete _allAppenders;
            _allAppenders 
=   NULL ;
        }
    }

再在HierarchyMaintainer中加入一下代码

    HierarchyMaintainer :: HierarchyMaintainer() {
        register_shutdown_handler(Appender
:: shutdownClear);
    }

在调用Category的静态函数shutdown时,会调用HierarchyMaintainer的shutdown,HierarchyMaintainer的shutdown会调用Appender::shutdownClear,从而将资源释放掉。

第二处

在MSThreads.hh中的ThreadLocalDataHolder的析构函数没有将_key所指的资源释放掉,而只是将_key释放掉,导致内存泄露。

解决方法,在析构函数中调用reset函数

 inline  ~ ThreadLocalDataHolder() {
    
reset ();
    TlsFree(_key);
};

 

最后

这两处是我在用VC2005写MFC代码是发现的,因为afx.h中开启了内存检测功能,所以一运行玩程序,就能在Output窗口中看到内存泄露信息。我就很奇怪,log4cpp他们就不在MFC下测试一下的吗?会英语的,写MFC代码的难道就都没发现(我不懂英语,就不跟他们交流了)?奇怪。。。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值