6675|14

92

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

频繁创建线程内存泄露 [复制链接]

   下面是创建线程,和线程函数的代码,每创建一次,则检测一次内存,发现内存会以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;
        }

最新回复

它确实会增加内存,但是不会几次就增加4K,或者8K,确定不是因为它的原因。因为用固定的数组来存放每次的内存,还是可以看到减少的。用字符串是方便显示  详情 回复 发表于 2010-1-25 09:02
点赞 关注

回复
举报

65

帖子

0

TA的资源

一粒金砂(初级)

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

回复

81

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
UP
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

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

回复

81

帖子

0

TA的资源

一粒金砂(初级)

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

回复

66

帖子

0

TA的资源

一粒金砂(初级)

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



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

回复

83

帖子

0

TA的资源

一粒金砂(初级)

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

回复

50

帖子

0

TA的资源

一粒金砂(初级)

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


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

回复

68

帖子

0

TA的资源

一粒金砂(初级)

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



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

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

回复

76

帖子

0

TA的资源

一粒金砂(初级)

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


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

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


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

回复

75

帖子

0

TA的资源

一粒金砂(初级)

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

回复

77

帖子

0

TA的资源

一粒金砂(初级)

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

回复

81

帖子

0

TA的资源

一粒金砂(初级)

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


CString 的 operator +=?

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

Paul, Chao @ Techware
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

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

回复

64

帖子

0

TA的资源

一粒金砂(初级)

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

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表