频繁创建线程内存泄露

nibian   2010-1-20 17:44 楼主
   下面是创建线程,和线程函数的代码,每创建一次,则检测一次内存,发现内存会以4K倍数减少。平均创建7,8次会减少4K,或者8K,或者12K。开始以为是线程代码引起的,后面线程里面都没代码了,还是有内存泄露。有谁遇到过同样问题的情解释一下,谢谢
DWORD WINAPI  ASyncCyclingPlayPhotosThread(LPVOID lpVoid)
{

        return 0;
}

void CVisualIntercomDlg::OnBnClickedBtnGuard()
{
        MEMORYSTATUS   mem_stat;
        DWORD dwThreadID;
        BOOL r;
        CString memory = L"可用内存";
        // 测试

        for(int i=0;i<100;i++)
        {
           HANDLE m_hASyncThreadHandle = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) ASyncCyclingPlayPhotosThread, (LPVOID)this, 0, &dwThreadID);

           WaitForSingleObject(m_hASyncThreadHandle,5000);

           if(m_hASyncThreadHandle)
           {
                r =  CloseHandle(m_hASyncThreadHandle);
           }
               
           memset(&mem_stat,0,sizeof(MEMORYSTATUS));
           mem_stat.dwLength = sizeof(MEMORYSTATUS);
           GlobalMemoryStatus(&mem_stat);
                 
               
           CString s;
           s.Format(L",%d", mem_stat.dwAvailPhys/1024);
           memory += s;
        }

回复评论 (14)

每次内存减少,是如何测的?LZ怎么就确定是以4K为单位减少的。。。?
点赞  2010-1-20 19:12
UP
点赞  2010-1-20 19:31
引用: 引用 1 楼 liuysheng 的回复:
每次内存减少,是如何测的?LZ怎么就确定是以4K为单位减少的。。。?


memset(&mem_stat,0,sizeof(MEMORYSTATUS));
  mem_stat.dwLength = sizeof(MEMORYSTATUS);
  GlobalMemoryStatus(&mem_stat);


  CString s;
  s.Format(L",%d", mem_stat.dwAvailPhys/1024);

这段代码不就是看内存的嘛,每次创建完线程,并且结束线程之后,我都查看了。当然不是每次都看,而是把每次的剩余内存写到字符串里面,循环100次之后看的。
点赞  2010-1-21 09:01
1. 你把代码精简下测测.
2. 使用release模式测试.
点赞  2010-1-21 09:29
引用: 引用 4 楼 flandy1982 的回复:
1. 你把代码精简下测测.
2. 使用release模式测试.


这代码还如何精简,我都只保留了最少的。
点赞  2010-1-21 09:50
内存泄露都是由于应该释放的内存没有释放导致的,可以往这方面考虑考虑…
点赞  2010-1-21 10:00
引用: 引用 6 楼 wolfmvp 的回复:
内存泄露都是由于应该释放的内存没有释放导致的,可以往这方面考虑考虑…


仔细看下代码吧,这里有动态分配内存?
点赞  2010-1-21 10:32
引用: 引用 5 楼 qwqwqw408 的回复:
引用 4 楼 flandy1982 的回复:
1. 你把代码精简下测测.
2. 使用release模式测试.



这代码还如何精简,我都只保留了最少的。

你确定你的代码就这么一点点? 我觉得这段代码没有任何问题.
点赞  2010-1-21 11:45
引用: 引用 8 楼 flandy1982 的回复:
引用 5 楼 qwqwqw408 的回复:
引用 4 楼 flandy1982 的回复:
1. 你把代码精简下测测.
2. 使用release模式测试.


这代码还如何精简,我都只保留了最少的。

你确定你的代码就这么一点点? 我觉得这段代码没有任何问题.


我的代码有很多,肯定不可能说创建一个空线程,这没意义嘛。只是我为了定位问题,把代码都去掉了。这段代码我试了很多次,运行一次,内存就少一点,但是少一定数量之后就稳定了。大概100多K吧
点赞  2010-1-21 13:36
mark。。。这个是个问题。我倒是没检测我的内存使用。。。
不过没有像LZ那么多次100次。每次等5秒的定值。。。我都是等待有信号来了在做。每次做多10次就出来
关注一下。。。
点赞  2010-1-21 13:42
从代码本身看不到什么问题,建议lz
1.排查一下是不是其他系统中的程序影响了这个线程
2.测试1万次看一下结果是什么
点赞  2010-1-22 19:31
引用: 引用楼主 qwqwqw408 的回复:
        ?  CString s;
        ?  s.Format(L",%d", mem_stat.dwAvailPhys/1024);
        ?  memory += s;


CString 的 operator +=?

LZ 确定它不会增加 memroy 的使用??

Paul, Chao @ Techware
点赞  2010-1-23 12:54
把CString s;移到for循环外面再试试。
点赞  2010-1-24 09:02
引用: 引用 12 楼 paul_chao 的回复:
引用楼主 qwqwqw408 的回复:
?? CString s;
?? s.Format(L",%d", mem_stat.dwAvailPhys/1024);
??memory += s;


CString 的 operator +=?

LZ 确定它不会增加 memroy 的使用??

Paul, Chao @ Techware


它确实会增加内存,但是不会几次就增加4K,或者8K,确定不是因为它的原因。因为用固定的数组来存放每次的内存,还是可以看到减少的。用字符串是方便显示
点赞  2010-1-25 09:02
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复