严重内存泄露问题,高手来看看

wangdongzjk 2006-11-03 10:01:21
本人第一次写c++程序,在run了一段程序后,整个程序crash掉,代码如下:

void CFileUtils::addRecordToList(Record record)
{
long thread_id = record.thread_id;
KeyMap::iterator pIter;


if(record.enter_exit == 2 && record.stack_depth == 1) // 结束标记
{
for(pIter = recordMap->begin(); pIter != recordMap->end(); pIter++)
{
if((*pIter).first == thread_id)
{
EvtList list = (*pIter).second;
EvtList::iterator lIter;
for(lIter = list.begin();lIter != list.end();lIter++)
{
writeRecordToFile(&(*lIter));
}
recordMap->erase(pIter);
break;
}
}
writeRecordToFile(&record);
}
else
{
for(pIter = recordMap->begin(); pIter != recordMap->end(); pIter++)
{
if((*pIter).first == thread_id)
{
EvtList list = (*pIter).second;
list.push_back(record);
recordMap->erase(pIter);
recordMap->insert(Pr(thread_id,list));
return;
}
}
//第一个event,直接插入到hashmap
EvtList list;
list.push_back(record);
recordMap->insert(Pr(record.thread_id,list));
}
}



类型定义
typedef list<Record> EvtList;

typedef hash_map<long, EvtList > KeyMap;

typedef hash_map<long, EvtList >::value_type Pr;

struct Record
{
public:
Record()
{
user_name = " ";
thread_id = 0;
}
virtual ~Record()
{

}
long thread_id;
string user_name;
};

请高手不吝赐教,200分相送。
...全文
1747 40 打赏 收藏 转发到动态 举报
写回复
用AI写文章
40 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangdongzjk 2006-11-28
  • 打赏
  • 举报
回复
我觉得也是,我的感觉是有指针指飞了
a_b_c_abc9 2006-11-27
  • 打赏
  • 举报
回复
内存泄漏不会使程序崩溃,只是不断的耗去内存.

搂主的程序应该是对容器使用不当造成的,前面已有很多分析.
wangdongzjk 2006-11-27
  • 打赏
  • 举报
回复
purify分析不出来
missilery 2006-11-26
  • 打赏
  • 举报
回复
推荐一个内存泄漏分析工具
IBM的Purify
lkpo 2006-11-26
  • 打赏
  • 举报
回复
对LIST容器调用了插入、删除等操作会使迭代器、引用等将失效!请参考《C++标准程序库》有关LIST容器的章节。

大概是这样吧
list<int> l;

list<ing>::iterator iter=l.begin();

//调用插入、删除等

*iter=100;//错误
wangdongzjk 2006-11-26
  • 打赏
  • 举报
回复
沉下去了,csdn的高手在哪里啊
wangdongzjk 2006-11-07
  • 打赏
  • 举报
回复
问题当然没有解决
RouteSim 2006-11-07
  • 打赏
  • 举报
回复
如果问题解决了,要说明是什么原因引起的,最鄙视那些问完问题就溜的家伙。
RouteSim 2006-11-07
  • 打赏
  • 举报
回复
和内存泄漏有什么关系啊??????? 你自己又没有分配和释放内存。

前面已经给了你答案了,



鸟牙(叉叉TV首席执行官) ( ) 信誉:100 Blog 2006-11-5 1:15:36 得分: 0
..

map<T> your_value;

for(map<T>::iterator it = your_value.begin();
it != your_value.end();
++it)
{
it = your_value.erase(it); // iterator next
}
你贴出的代码的第十八行“recordMap->erase(pIter);”
要修改迭代器:pIter = recordMap->erase(pIter);(修改为)

我不敢说你的程序crash调肯定是这条语句引起的,但这条语句肯定能让你的程序crash掉。


swimmer2000 2006-11-06
  • 打赏
  • 举报
回复
程序如果有内存泄露是不会crash的,
应该尽可能的提供程序出错信息.
sunboyyq 2006-11-06
  • 打赏
  • 举报
回复
收藏
wangdongzjk 2006-11-06
  • 打赏
  • 举报
回复
如果我单独run这个程序不会报告任何错误,只是我把它放在另一个线程调用的时候才会crash掉,所以不知道是什么原因。还有就是上面提供的C++的内存泄露检测方法无法显示哪个文件中有内存泄露,不知道是不是使用方法不正确。
csShooter 2006-11-06
  • 打赏
  • 举报
回复
mark
KenYuan2016 2006-11-06
  • 打赏
  • 举报
回复
把你的添加和删除功能分开。
IniMap()
DelMap()
InsertMap()
别搞在一起,看着好不舒服,好比博士的水平幼儿园的字。
carbonic 2006-11-06
  • 打赏
  • 举报
回复
它无法访问苹果
=======================

不知所云.....
KenYuan2016 2006-11-06
  • 打赏
  • 举报
回复
不是内存泄漏的错误。

插入之后,不能删除,你把数据插入到map中之后,应该去做别的事情, recordMap->erase(pIter);
操作是错误的, 自由在你出map的那个函数中调用删除才是正确的操作。

1.new 实体 A -》 insert Map
。。。。
N.不再使用 实体A -》search 到 A 弹出来-》 删除A 这时候才是释放空间。


就像你要存储苹果,你买了一个放在苹果箱子里(这个苹果对箱子来说是新的,也就是new出来的内存),然后你把苹果吃掉了,剩一个苹果把给箱子(指针,你把内存释放了),箱子拿着苹果把报错(它无法访问苹果)。
dfkoko 2006-11-05
  • 打赏
  • 举报
回复
jf
neustrong 2006-11-05
  • 打赏
  • 举报
回复
关注。。
love_ie872 2006-11-05
  • 打赏
  • 举报
回复
楼住是由JAVA转向C++的吧!但是我发现你用C++,都是摸板技术啊(STL).本来这个东西是很深的.由于你是刚刚接触C++, 我认为你应该专门的找些关于STL技术方面的书籍来看看!想这样对你可能有些帮助!
我也学过JAVA,JAVA和C++的确在有些方面有区别!
BeginnerCpp 2006-11-05
  • 打赏
  • 举报
回复
#define MYNEW(P, T)
{
P = new T;
TRACE("In %s : %s, new a %s at %s.", _FILE_, _LINE_, #T, #P);
}

=================

应该是 :

#define MYNEW(P, T)
{
P = new T;
TRACE("In %s : %s, new a %s at %d.", _FILE_, _LINE_, #T, P);
}
加载更多回复(19)

64,680

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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