1.缘由

一直对log4cpp非常有好感,就在自己的项目中集成了log4cpp1.1.1版本,并围绕着它建立了一系列的封装函数方便外部调用。写完了一个测试代码后,忽然想看看自己写的程序有没有内存泄露问题。在打开了内存检查参数后发现,有程序退出时有不少内存没有释放。由于我的测试程序很小,所以很快就定位到了原来是log4cpp退出时有Appender对象没有释放。拿起谷歌搜了一把网上没有很好的解决方案,本着自己动手丰衣足食的方法,自己动手调整了下代码,到目前为止暂时没有发现新问题。废话不多说了,直接上修改步骤。

2.修改步骤

2.1.在Appender.hh的Appender类中添加公共静态函数

   static void destroyAppender();

2.2.在Appender.cpp中实现添加的函数

     void Appender::destroyAppender()
{
Appender::closeAll();
Appender::_deleteAllAppenders();
delete _allAppenders;
_allAppenders = nullptr;
}

2.3.修改Appender::_deleteAllAppenders()函数

按照以上方案修改后,你会发现执行到_deleteAllApenders()函数会导致崩溃,原因是在于Appender的析构函数中会修改容器,因此需要对该函数做出微调

    void Appender::_deleteAllAppenders() {
threading::ScopedLock lock(_appenderMapMutex);
AppenderMap& allAppenders = _getAllAppenders();
size_t nCount=allAppenders.size();
for(AppenderMap::iterator i = allAppenders.begin(); nCount>0; --nCount) {
Appender *app = (*i).second;
i++; // increment iterator before delete or iterator will be invalid.
delete (app);
}
}

可以看到我是用一个数量来控制循环的结束。注意循环退出以后,再也不要操作allAppenders容器了,不然还是崩溃。

2.4.增加退出清理事件

在HierarchyMaintainer的构造函数中,把我们自己新建的函数注册到退出回调,代码如下

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

按照以上修改步骤之后,重新编译更新下库文件以后再看已经没有了内存泄露问题,问题得到解决。

log4cpp退出时内存泄露的修复方案的更多相关文章

  1. boost thread 在非正常退出时 内存泄露问题

    在使用boost的thread库的时候,如果主程序退出,thread创建的线程不做任何处理,则会出现内存泄露. 解决方法: 在主线程退出时,对所有thread使用interrupt()命令,然后主程序 ...

  2. MFC误报内存泄露的修复

    在debug状态退出程序的时候,VS会在输出窗口列出可能的内存泄露的地方. MFC中使用DEBUG_NEW能够更方便的定位泄露的地点.但假如MFC的dll释放""过早"& ...

  3. dbcp 1.4 底层连接断开时内存泄露bug

    在dbcp 1.4中,如果底层的连接已经与数据库断开了,此时dbcp 1.4的实现并不释放内部连接,虽然早已提供了removeAbandoned和removeAbandonedTimeout参数,但是 ...

  4. JVM内存管理概述与android内存泄露分析

    一.内存划分 将内存划分为六大部分,分别是PC寄存器.JAVA虚拟机栈.JAVA堆.方法区.运行时常量池以及本地方法栈. 1.PC寄存器(线程独有):全称是程序计数寄存器,它记载着每一个线程当前运行的 ...

  5. android 退出方案 导致内存泄露

    比较奇怪android没有给出一个统一的退出接口,网上查了很多材料也出现了一些错误,在此记录一下,遇到的,与总结的. 1.常见概念,方法 finish() 通知结束当前activity实例,finis ...

  6. 查找并修复Android中的内存泄露—OutOfMemoryError

    [编者按]本文作者为来自南非约翰内斯堡的女程序员 Rebecca Franks,Rebecca 热衷于安卓开发,拥有4年安卓应用开发经验.有点完美主义者,喜爱美食. 本文系国内ITOM管理平台 One ...

  7. Qt中内存泄露和退出崩溃的问题 delete

    Qt中帮程序员做了一些内存回收的事情,但正因为这些反而让对此不熟悉的人会屡屡犯错. 收录一篇不错的文章: 在C++中学习过程中,我们都知道: delete 和 new 必须 配对使用(一 一对应):d ...

  8. Object-C使用类静态方法创建对象时容易内存泄露

    1.所谓使用类的静态方法创建对象,就是指使用类名调用一次它的静态方法(非显式调用alloc)便可以得到一个新建的对象,比如下面两个例子: NSString* str1 = [NSString stri ...

  9. 使用ViwePager显示图片时如何防止内存泄露。

    内存泄露的检测. 1. 在Android Studio中运行你的应用,然后切换到输出窗口的Android tab. 2. 尽情的玩耍你的应用,最好各个功能都用到,如果是Viewpager,则多滑动一些 ...

随机推荐

  1. python爬取拉勾网职位数据

    今天写的这篇文章是关于python爬虫简单的一个使用,选取的爬取对象是著名的招聘网站--拉钩网,由于和大家的职业息息相关,所以爬取拉钩的数据进行分析,对于职业规划和求职时的信息提供有很大的帮助. 完成 ...

  2. HDU 4763 Theme Section

    题目: It's time for music! A lot of popular musicians are invited to join us in the music festival. Ea ...

  3. Spark算子--join

      join--Transformation类算子 代码示例 result  

  4. C++异常层次结构

    #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; class MyArray { publi ...

  5. Laravel5.5 的 Homestead 开发环境部署

    首先明白以下几个概念 VirtualBox  -- Oracle 公司的虚拟机软件, 能运行在当前大部分流行的系统上; Vagrant 提供一种命令行接口, 允许自动化安装虚拟机, 并且因为是脚本编写 ...

  6. API接口签名验证2

    http://www.jianshu.com/p/d47da77b6419 系统从外部获取数据时,通常采用API接口调用的方式来实现.请求方和�接口提供方之间的通信过程,有这几个问题需要考虑: 1.请 ...

  7. 用户使用VPS的12个常见问题

    1.VPS主机用户能否进行备份? VPS主机允许用户进行自主的备份,这个操作非常简单,是需要在用户控制面板点击备份按钮即可.同时还允许用户恢复到任何备份状态. 2.当某个VPS主机用户被攻击时,会不会 ...

  8. Tomcat 源码分析(二)——Request处理全过程

    前一篇博客,我总结了Tomcat对于生命周期组件的管理.在了解了容器的启动之后,我们开始剖析它的内部运行机制.今天我们来分析一下Tomcat如何处理Request.Socket作为网络通信的基础也是R ...

  9. Java通配符解惑

    T  有类型 ?  未知类型 一.通配符的上界 既然知道List<Cat>并不是List<Anilmal>的子类型,那就需要去寻找替他解决的办法, 是AnimalTrianer ...

  10. JavaScript对象的valueOf()方法

    js对象中的valueOf()方法和toString()方法非常类似,但是,当需要返回对象的原始值而非字符串的时候才调用它,尤其是转换为数字的时候.如果在需要使用原始值的上下文中使用了对象,JavaS ...