log4cpp的内存泄露

mostneed 2005-03-21 03:03:44
使用开源的log4cpp作为日志输出模块。
在程序结束的时候调用了 log4cpp::Category::shutdown() 释放资源。可是还是有内存泄露
Dumping objects ->
{163} normal block at 0x00397608, 48 bytes long.
Data: < p9 Xt9 p9 > C0 70 39 00 58 74 39 00 C0 70 39 00 CD CD CD CD
{162} normal block at 0x003975B0, 24 bytes long.
......

各位大侠有没有碰到这个问题,我上log4cpp的网站查论坛,有回复说是VC的误报,纳闷ing...

谢谢先,分不够开帖再给
...全文
636 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
mostneed 2005-04-01
  • 打赏
  • 举报
回复
to sodangerous(机器人) :
char* a = new char;
try
{
...
}
catch(Exception1)
{
delete a;
throw;
}
catch(Exception2)
{
delete a;
throw;
}
delete a;

或者用数组保存指针,释放的时候遍厉数组删除指针释放内存

这时候delete和new个数不一样了。
ooocxg 2005-03-31
  • 打赏
  • 举报
回复
建议使用log4cxx
log4cxx和log4cpp有些渊源,目前来看log4cxx还在持续维护开发中
goodheartppl 2005-03-31
  • 打赏
  • 举报
回复
你DELETE一下就可以

你把代码帖出来看看
mostneed 2005-03-31
  • 打赏
  • 举报
回复
问题查明,是log4cpp 0.3.4b的bug。
以后谨慎考虑使用开源的软件。呵呵

http://sourceforge.net/mailarchive/forum.php?forum_id=2367

3天后结帖,来者有分。
anni 2005-03-31
  • 打赏
  • 举报
回复
用较稳定且已成形的开源软件。
sodangerous 2005-03-31
  • 打赏
  • 举报
回复
搜索一下new,记录new的个数,搜索一下delete,记录下delete的个数,如果个数不同,肯定存在内存泄漏!!!此法很笨,但我发现还勉强可以使用!!!
mostneed 2005-03-31
  • 打赏
  • 举报
回复
BoundChecker 是非常好的东西,
以前一直使用,可是现在项目升级到VS2003了,BoundChecker新版本一直没有,
各位大侠有没有地方可以下载呢?
oyljerry 2005-03-31
  • 打赏
  • 举报
回复
这种开源的代码一般需要不停的纠正bug,能体会楼主的心情 ^_^
goodheartppl 2005-03-31
  • 打赏
  • 举报
回复
用 log4cxx
mostneed 2005-03-24
  • 打赏
  • 举报
回复
main里有new,没有delete,但是log4cpp的代码里shutdown函数已经将Appender,layout等都delete了
可是VC仍然报有泄露
xxrl 2005-03-22
  • 打赏
  • 举报
回复
开源的毕竟无保障
inpriser 2005-03-22
  • 打赏
  • 举报
回复
学习ing
mostneed 2005-03-22
  • 打赏
  • 举报
回复
这里是log4cpp给的例子,各为看看有没有内存泄露。

另外,log4cpp的下载地址为: ver: 0.3.4b
http://sourceforge.net/project/showfiles.php?group_id=15190

#include <stdio.h>
#include "log4cpp/Portability.hh"
#ifdef LOG4CPP_HAVE_UNISTD_H
#include <unistd.h>
#endif
#include <iostream>
#include "log4cpp/Category.hh"
#include "log4cpp/Appender.hh"
#include "log4cpp/FileAppender.hh"
#include "log4cpp/OstreamAppender.hh"
#ifdef LOG4CPP_HAVE_SYSLOG
#include "log4cpp/SyslogAppender.hh"
#endif
#include "log4cpp/Layout.hh"
#include "log4cpp/BasicLayout.hh"
#include "log4cpp/Priority.hh"
#include "log4cpp/NDC.hh"

int main(int argc, char** argv) {
log4cpp::Appender* appender;
#ifdef LOG4CPP_HAVE_SYSLOG
log4cpp::SyslogAppender* syslogAppender;

syslogAppender = new log4cpp::SyslogAppender("syslog", "log4cpp");
#else
log4cpp::Appender* syslogAppender;

syslogAppender = new log4cpp::OstreamAppender("syslogdummy", &std::cout);
#endif

if (argc < 2) {
appender = new log4cpp::OstreamAppender("default", &std::cout);
} else {
appender = new log4cpp::FileAppender("default", argv[1]);
}

syslogAppender->setLayout(new log4cpp::BasicLayout());
appender->setLayout(new log4cpp::BasicLayout());

log4cpp::Category& root = log4cpp::Category::getRoot();
root.addAppender(syslogAppender);
root.setPriority(log4cpp::Priority::ERROR);

log4cpp::Category& sub1 = log4cpp::Category::getInstance(std::string("sub1"));
sub1.addAppender(appender);

log4cpp::Category& sub2 = log4cpp::Category::getInstance(std::string("sub1.sub2"));

log4cpp::NDC::push(std::string("ndc1"));

std::cout << " root prio = " << root.getPriority() << std::endl;
std::cout << " sub1 prio = " << sub1.getPriority() << std::endl;
std::cout << " sub2 prio = " << sub2.getPriority() << std::endl;

root.error("root error");
root.warn("root warn");
sub1.error("sub1 error");
sub1.warn("sub1 warn");
sub2.error("sub2 error");
sub2.warn("sub2 warn");

sub1.setPriority(log4cpp::Priority::INFO);
std::cout << " root prio = " << root.getPriority() << std::endl;
std::cout << " sub1 prio = " << sub1.getPriority() << std::endl;
std::cout << " sub2 prio = " << sub2.getPriority() << std::endl;

std::cout << "priority info" << std::endl;
root.error("root error");
root.warn("root warn");
sub1.error("sub1 error");
sub1.warn("sub1 warn");
sub2.error("sub2 error");
sub2.warn("sub2 warn");

sub2.warnStream() << "streamed warn";

sub2 << log4cpp::Priority::WARN << "warn2" << " warn3" <<
log4cpp::CategoryStream::ENDLINE << " warn4";

{
for(int i = 0; i < 10000; i++) {
char ndc2[20];
sprintf(ndc2, "i=%d", i);
log4cpp::NDC::push(ndc2);
sub1.info("%s%d", "i = ", i);
if ((i % 10) == 0) {
sub1.log(log4cpp::Priority::NOTICE, "reopen log");
if (log4cpp::Appender::reopenAll()) {
sub1.info("log reopened");
} else {
sub1.warn("could not reopen log");
}
}
#ifndef WIN32
sleep(1);
#endif
log4cpp::NDC::pop();
}
}
}
xuzheng318 2005-03-21
  • 打赏
  • 举报
回复
帮楼主顶,关注!
hxzb7215191 2005-03-21
  • 打赏
  • 举报
回复
gz
gaooo 2005-03-21
  • 打赏
  • 举报
回复
gz
oyljerry 2005-03-21
  • 打赏
  • 举报
回复
要么作一下压力测试
oyljerry 2005-03-21
  • 打赏
  • 举报
回复
检测内存泄漏的基本工具是调试器和CRT调试堆函数。为了使用调试堆函数,在你的程序中你必须含有下面的说明:

#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
#include说明必须按顺序说明。如果你改变了顺序,你所用的函数可能不能正常工作。包含crtdbg.h的_malloc_dbg和 _free_dbg将 malloc和free函数映射到测试版中,它可以跟踪内存的分配和释放。这种映射仅仅在一个测试体系中发生(也就是说,仅仅当_DEBUG被定义的时候)。释放的体系使用通常的malloc和 free功能。

#define说明映射CRT堆函数的低级版本到相应的测试版本。这个说明是不需要的,但是没有它,内存泄漏处含有的只是没有多大用处的信息。

一旦你已经增加了刚才的说明,你能够通过在你的程序中包含下面的说明来释放内存信息:

_CrtDumpMemoryLeaks();
当你在调试情况下运行你的程序时,在输出窗口的Debug 标签处_CrtDumpMemoryLeaks表现出内存泄漏的信息。

mostneed 2005-03-21
  • 打赏
  • 举报
回复
用smartcheck也是没有任何作用,那个调试vb程序挺好

有没有使用过log4cpp的大侠阿

救救小弟
老夏Max 2005-03-21
  • 打赏
  • 举报
回复
没有BoundsChecker可以使用SmartChecker。直接调试EXE程序!
http://www.vckbase.com/tools/debug/sc603.zip
加载更多回复(5)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧