有一个这样的程序
struct STRUCT1{
....
};
线程函数:
UINT thread1(LPVOID parameter){
STRUCT1 *stru=(STRUCT1 *)parameter;
....
delete stru;
return 0;
}
主函数:
int main(){
STRUCT1 *stru;
......
while(1){
if(....){
stru=new STRUCT1;
AfxBeginThread(thread1,stru);
}
Sleep(2000);
}
return 0;
}程序运行一段时间后发现使用的内存不断地变化,但是最终都是一直往上增长的,但是可以肯定所有线程都正确的退出了,而且delete stru;语句也的确有执行。
问题出现在哪边呢?
分不够可以加
struct STRUCT1{
....
};
线程函数:
UINT thread1(LPVOID parameter){
STRUCT1 *stru=(STRUCT1 *)parameter;
....
delete stru;
return 0;
}
主函数:
int main(){
STRUCT1 *stru;
......
while(1){
if(....){
stru=new STRUCT1;
AfxBeginThread(thread1,stru);
}
Sleep(2000);
}
return 0;
}程序运行一段时间后发现使用的内存不断地变化,但是最终都是一直往上增长的,但是可以肯定所有线程都正确的退出了,而且delete stru;语句也的确有执行。
问题出现在哪边呢?
分不够可以加
解决方案 »
- 在mfc中,用双缓冲,把几张图先全画在一个虚拟画布上,然后再一次过贴上客户区,解决闪烁的问题
- 菜鸟求助,请问如何重新调用dodataexchange交换picture控件和类对象的数据
- 如何得到unicode字符
- 用什么方法,可以修改ComBoBox的下拉大小,不是修改资源,不通过代码.
- 关于VC++ IDE的一个问题
- COM\ATL\WTL
- 用timeSetEvent 后在回调函数里实现内的代码 与程序主线程里的代码是在同一个线程里吗??
- 为什么我读取DLL文件失败???
- 一个鼠标钩子的问题,请大家帮帮忙?
- 有没有人想知道倒计时关机的源码??
- 请假各位大侠关于CORBA的问题
- 是否可以截获windows的文件或文件夹粘贴(包括拖动)的操作?
LONG numOfStru = 0;在stru=new STRUCT1;
后面加1行InterlockedIncrement ( &numOfStru );在线程里面delete STRUCTl前面加一行
InterlockedDecrement ( &numOfStru );然后随时关注 numOfStru的数量就知道问题出在哪里了
因为线程的最后一句语句都执行了,所以可以肯定delete是肯定有执行的(它后面的语句执行了),现在的问题是似乎没效果,不知道引起内存占用不断增加是否是由其它原因引起,程序里面除了主线程与几个thread1外没有其它thread。
DWORD WINAPI thread1(LPVOID parameter){
STRUCT1 *stru=(STRUCT1 *)parameter;
....
delete stru;
return 0;
}启动线程时
HANDLE handle=CreateThread(0,0,thread1,stru,0,&tid);
CloseHandle(handle);结果还是一样。
到底有没有人碰到过这样的问题呀
struct STRUCT1{
....
};
如果在里面有指针,这个指针又指向一块内存,如果不释放的话,就有内存泄漏。
你在debug模式下运行一次。
看看有没有内存泄漏,
如果有可以看出是在哪个文件的哪行导致了内存泄漏
或者系统堆栈不断增加
而UINT thread1(LPVOID parameter)这个线程函数结束的次数少
之间就有一个差值,你不断增加线程,而其中某些线程并没有结束呢,
他们最终会结束,但在结束前已经又调用了AfxBeginThread(thread1,stru);
系统堆栈不断增加是什么意思呢?
线程数肯定没有不断增加的,因为程序里做了一个计数器,对活动线程进行计数,可以看出线程在通常情况下都是0个(除了主线程)