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