首页
社区
课程
招聘
求助]CreateThread传入struct作参数,狂吃内存
发表于: 2009-3-4 14:01 7386

求助]CreateThread传入struct作参数,狂吃内存

2009-3-4 14:01
7386
sdk做个程序,处理数据较多用了多线程CreateThread,但需要传入3个参数,就想到了struct,运行时却狂吃内存,明显出现内存严重泄露,研究了许多天不知道问题何在,请高手指点:
struct MYThreadData
{
  TCHAR Filepath[256];
  HWND m_list;
  int i;
}_MYThreadData,*_LPC_MYThreadData;


for(int i=0;i<1000;i++)
{
MYThreadData *myData=NULL;
myData=(struct MYThreadData *)malloc(sizeof(struct MYThreadData));
wcscpy(myData->Filepath,szModName);
myData->m_list=m_list;
myData->i=i;
CreateThread(NULL,0,ThreadCheckFileTrust,(LPVOID)myData,NULL,NULL);
}



DWORD WINAPI ThreadCheckFile(LPVOID lpParam)   
{
struct MYThreadData* myThreadData=(struct MYThreadData *)lpParam;


if(!myfun(myThreadData->Filepath))
{
......
  return true;
}
  return false;
} 

按理就加入free(lpParam);,但加入易出错,即内存不能为什么之类的

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (12)
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
2
貌似你开了1000个线程?开多了有副作用的。线程函数执行完毕就释放内存啊
2009-3-4 14:28
0
雪    币: 148
活跃值: (59)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
线程开太多,Sleep一下
2009-3-4 15:16
0
雪    币: 218
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
NaX
4
1000线程 强悍。 myData明显就是同一样东西,除了i不同,有必要分配1000次内存?
2009-3-4 15:27
0
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
用动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元。直到程序结束。即所谓内存泄漏。  先不谈你为什么要malloc1000次啊1000次。至少我没看见free的地方。

free(lpParam);出错:lpParam确保是由malloc得到的并且之前没有free()操作吗?

你的程序复杂到什么程度? 需要用1000个线程来做?

PS:我其实是想看看自己回复的头像的。
2009-3-5 13:00
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
同意楼上,可以在线程 return 前调用 free。
2009-3-5 15:50
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
你这个肯定吃内存。
2009-3-5 23:57
0
雪    币: 0
活跃值: (954)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
8
你才知道啊?内存分配不好,当然吃内存了!
2009-3-6 10:05
0
雪    币: 290
活跃值: (20)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
把开始申请的内存用链表保存下来
开个单独的线程专门等待其它线程结束,当线程结束在链表中查找就可以释放对应的申请的内存
你开始使用是因为线程有可能还在使用此内存但是你释放了这时当然会崩溃
2009-3-6 17:53
0
雪    币: 290
活跃值: (20)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
10
看了你的代码你其实更简单可以在每个线程返回前把那段内存释放
2009-3-6 17:55
0
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
你没有设置堆栈大小。每个线程都有一个堆栈。
如果CreateThread中堆栈大小参数(第2个参数)设置为0,那么线程的堆栈就是缺省大小,
可能是512K,1M。
1000个线程就是1G内存。
2009-3-6 23:29
0
雪    币: 331
活跃值: (56)
能力值: ( LV13,RANK:410 )
在线值:
发帖
回帖
粉丝
12
没见释放当然会泄露。
多线程不是多多益善的。楼主要注意这一点。
过多的线程会在Context切换上消耗大量的资源。
2009-3-7 01:08
0
雪    币: 137
活跃值: (12)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
13
谢谢大家,我参考修改下,不行再讨论,谢谢
2009-3-11 13:57
0
游客
登录 | 注册 方可回帖
返回
//