log4cpp 内存泄漏的一个出现情况
2011-09-29 22:12
246 查看
一直用log4cpp的library方式(非DLL)连接到自己的程序中(可从我的资源中下载)
最近发现一个内存泄漏的问题,感觉很奇怪:
从主程序中传入一个Category对象的指针pLog到类实例Ca中,Ca对象存在于独立的DLL中并且用 LoadLibrary(..)的方式装载到主程序。
当DLL被装载后,Ca开启一个线程Ta并把pLog传入到此线程Ta中。
主程序与Ca对象全部以static library的方式引用了 log4cpp。
OK,出现内存泄漏的情况是:只要线程Ta中调用了日志的任何函数(debug,info...),就会出现'泄漏'(当然这个不一定称为泄漏,请看我以前的文章)。
查了这个问题的原因,也大概看了一下代码。终于找到了问题的所在:
当log4cpp以 static library 的形式被调用时,任何调用的对象都会 'Copy'一份到自己的‘空间’里。所以,Ca所在的DLL会拥有一份,主程序也会有一份,而每一份log4cpp的COPY都会生成一个
namespace {
threading::ThreadLocalDataHolder<NDC> _nDC;
}
实例。(请参看:NDC.CPP 27行)
_nDC对象的用处看其定义就应该明白大概的了! ---- 与线程有关!(具体请大家自己看代码吧 :( )
当在 Ta 中调用时,使用的_nDC 是主线程是实例!
在线程 Ta 的最后调用 log4cpp::NDC::clearCurrentThreadNDC() 时,使用的_nDC则是当前Dll内的一个实例(请看我的另一文章/article/2662828.html),根据不同的实例对查找资源,当然就找不到要删除的内存了!
你会发现:那此时不是有两个一模一样的全局对象了! 名字也相同?!
是的,这是允许的!大家可以去查询一下相关的资料!(http://stackoverflow.com/questions/2928957/is-it-possible-to-declare-multiple-static-variable-with-same-name-in-a-single-c-f)
所以,解决的方案是:把 log4cpp 的 static library 的使用方式换成 DLL 的方式!保证在一个 process 中,只有一个 _nDC 实例存在!
(我已经编译好了一份,大家可以在这里下载:http://download.csdn.net/detail/Ani/3648356)
有问题请指正!
欢迎转载!
最近发现一个内存泄漏的问题,感觉很奇怪:
从主程序中传入一个Category对象的指针pLog到类实例Ca中,Ca对象存在于独立的DLL中并且用 LoadLibrary(..)的方式装载到主程序。
当DLL被装载后,Ca开启一个线程Ta并把pLog传入到此线程Ta中。
主程序与Ca对象全部以static library的方式引用了 log4cpp。
OK,出现内存泄漏的情况是:只要线程Ta中调用了日志的任何函数(debug,info...),就会出现'泄漏'(当然这个不一定称为泄漏,请看我以前的文章)。
查了这个问题的原因,也大概看了一下代码。终于找到了问题的所在:
当log4cpp以 static library 的形式被调用时,任何调用的对象都会 'Copy'一份到自己的‘空间’里。所以,Ca所在的DLL会拥有一份,主程序也会有一份,而每一份log4cpp的COPY都会生成一个
namespace {
threading::ThreadLocalDataHolder<NDC> _nDC;
}
实例。(请参看:NDC.CPP 27行)
_nDC对象的用处看其定义就应该明白大概的了! ---- 与线程有关!(具体请大家自己看代码吧 :( )
当在 Ta 中调用时,使用的_nDC 是主线程是实例!
在线程 Ta 的最后调用 log4cpp::NDC::clearCurrentThreadNDC() 时,使用的_nDC则是当前Dll内的一个实例(请看我的另一文章/article/2662828.html),根据不同的实例对查找资源,当然就找不到要删除的内存了!
你会发现:那此时不是有两个一模一样的全局对象了! 名字也相同?!
是的,这是允许的!大家可以去查询一下相关的资料!(http://stackoverflow.com/questions/2928957/is-it-possible-to-declare-multiple-static-variable-with-same-name-in-a-single-c-f)
所以,解决的方案是:把 log4cpp 的 static library 的使用方式换成 DLL 的方式!保证在一个 process 中,只有一个 _nDC 实例存在!
(我已经编译好了一份,大家可以在这里下载:http://download.csdn.net/detail/Ani/3648356)
有问题请指正!
欢迎转载!
相关文章推荐
- WORD2007只可以打开一个文档,且打开后文本有时出现不可 编辑情况
- 出现了一个意外情况,不能完成所有你在设置中所要求的更改
- 在Tomcat的server.xml中配置两个context,出现其中一个不能正常启动,交换配置顺序,另一个又不能正常启动,即始终只有第二个配置能启动的情况。如果单独部署,都没有问题。报错大致内容如下
- 出现了一个意外的情况 。不能完成所有你在设置中所要求的更改
- APP出现内存泄漏的几种情况
- 删除表中的一个列名字段表出现如下情况
- 当一个界面有多个ViewPager的时候,如果出现某一个不显示的情况
- Android中常出现内存泄漏的情况
- 删除表中的一个列名字段表出现如下情况
- 10、 java 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 要求不能出现截半的情况
- 一道简单的String面试题-找出非连续成对出现的一个字母(临界情况)
- 安卓获取context是一个null对象的引用所出现的其中一种情况!坑
- Eclipse中在android项目中出现新建一个Activity后,出现整个project的报错以及包导入以后无法执行等等情况分析。
- AfxBeginThread开始一个线程出现内存泄漏
- 阿里巴巴 2015 实习笔试题 分布式系统中的RPC请求经常出现乱序的情况 写一个算法来将一个乱序的序列保序输出
- 在做Urlwrite+struts2.0的一个小示例的时候老是出现找不到action的情况404错误
- Android中常出现内存泄漏的情况
- 用VS2013版本打开一个WinPhone源码时出现下列情况,无法兼容
- 两个getchar,一个getchar,getch的不同点 出现的不同情况
- 解决springmvc在单纯返回一个字符串对象时所出现的乱码情况(极速版)