频繁创建线程内存泄露

时间:2022-06-29 22:47:10
   下面是创建线程,和线程函数的代码,每创建一次,则检测一次内存,发现内存会以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 个解决方案

#1


每次内存减少,是如何测的?LZ怎么就确定是以4K为单位减少的。。。?

#2


UP

#3


引用 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次之后看的。

#4


1. 你把代码精简下测测.
2. 使用release模式测试.

#5


引用 4 楼 flandy1982 的回复:
1. 你把代码精简下测测.
2. 使用release模式测试.


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

#6


内存泄露都是由于应该释放的内存没有释放导致的,可以往这方面考虑考虑…

#7


引用 6 楼 wolfmvp 的回复:
内存泄露都是由于应该释放的内存没有释放导致的,可以往这方面考虑考虑…


仔细看下代码吧,这里有动态分配内存?

#8


引用 5 楼 qwqwqw408 的回复:
引用 4 楼 flandy1982 的回复:
1. 你把代码精简下测测.
2. 使用release模式测试.



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

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

#9


引用 8 楼 flandy1982 的回复:
引用 5 楼 qwqwqw408 的回复:
引用 4 楼 flandy1982 的回复:
1. 你把代码精简下测测.
2. 使用release模式测试.


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

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


我的代码有很多,肯定不可能说创建一个空线程,这没意义嘛。只是我为了定位问题,把代码都去掉了。这段代码我试了很多次,运行一次,内存就少一点,但是少一定数量之后就稳定了。大概100多K吧

#10


mark。。。这个是个问题。我倒是没检测我的内存使用。。。
不过没有像LZ那么多次100次。每次等5秒的定值。。。我都是等待有信号来了在做。每次做多10次就出来
关注一下。。。

#11


从代码本身看不到什么问题,建议lz
1.排查一下是不是其他系统中的程序影响了这个线程
2.测试1万次看一下结果是什么

#12


引用楼主 qwqwqw408 的回复:
     CString s;
     s.Format(L",%d", mem_stat.dwAvailPhys/1024);
      memory += s;


CString 的 operator +=?

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

Paul, Chao @ Techware

#13


把CString s;移到for循环外面再试试。

#14


引用 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,确定不是因为它的原因。因为用固定的数组来存放每次的内存,还是可以看到减少的。用字符串是方便显示

#1


每次内存减少,是如何测的?LZ怎么就确定是以4K为单位减少的。。。?

#2


UP

#3


引用 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次之后看的。

#4


1. 你把代码精简下测测.
2. 使用release模式测试.

#5


引用 4 楼 flandy1982 的回复:
1. 你把代码精简下测测.
2. 使用release模式测试.


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

#6


内存泄露都是由于应该释放的内存没有释放导致的,可以往这方面考虑考虑…

#7


引用 6 楼 wolfmvp 的回复:
内存泄露都是由于应该释放的内存没有释放导致的,可以往这方面考虑考虑…


仔细看下代码吧,这里有动态分配内存?

#8


引用 5 楼 qwqwqw408 的回复:
引用 4 楼 flandy1982 的回复:
1. 你把代码精简下测测.
2. 使用release模式测试.



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

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

#9


引用 8 楼 flandy1982 的回复:
引用 5 楼 qwqwqw408 的回复:
引用 4 楼 flandy1982 的回复:
1. 你把代码精简下测测.
2. 使用release模式测试.


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

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


我的代码有很多,肯定不可能说创建一个空线程,这没意义嘛。只是我为了定位问题,把代码都去掉了。这段代码我试了很多次,运行一次,内存就少一点,但是少一定数量之后就稳定了。大概100多K吧

#10


mark。。。这个是个问题。我倒是没检测我的内存使用。。。
不过没有像LZ那么多次100次。每次等5秒的定值。。。我都是等待有信号来了在做。每次做多10次就出来
关注一下。。。

#11


从代码本身看不到什么问题,建议lz
1.排查一下是不是其他系统中的程序影响了这个线程
2.测试1万次看一下结果是什么

#12


引用楼主 qwqwqw408 的回复:
     CString s;
     s.Format(L",%d", mem_stat.dwAvailPhys/1024);
      memory += s;


CString 的 operator +=?

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

Paul, Chao @ Techware

#13


把CString s;移到for循环外面再试试。

#14


引用 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,确定不是因为它的原因。因为用固定的数组来存放每次的内存,还是可以看到减少的。用字符串是方便显示