第一處
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代碼的難道就都沒發現(我不懂英語,就不跟他們交流了)?奇怪。。。