4166|19

66

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

wince的多线程内存泄漏问题,请高手帮忙 [复制链接]

按钮事件
void CleakerDlg::OnBnClickedButton1()
{
        HANDLE a = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ReadData, NULL, 0, NULL);
         
}
线程函数
void WINAPI ReadData()
{
        for(int i=0;i<10000;i++)
        {
                char* aa = new char[1000];
                for(int j=0;j<10000;j++)
                {
                }
                delete [] aa;
        }
}
当点击一下按钮,内存在减少4k之后很快会恢复。但是当不断的点击按钮创建线程的时候,内存在减少的时候不会恢复。
请高手指教,是不是在线程切换的时候导致了内存泄漏?

最新回复

CloseHandle()只是关闭一个句柄,并不会关闭该句柄对应的线程。。。。  详情 回复 发表于 2009-8-24 20:21
点赞 关注

回复
举报

64

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
没有关闭线程
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
等待高手啊
 
 
 

回复

173

帖子

0

TA的资源

一粒金砂(高级)

4
 
自己顶,很简单的现象,但是怎么都搞不定,唉......
 
 
 

回复

53

帖子

0

TA的资源

一粒金砂(初级)

5
 
    参考一下:   

    HANDLE  handle;
    DWORD dwThreadID = 0;
    handle  = ::CreateThread(0, 0, SendThreadStart, this, 0, &dwThreadID);
    CloseHandle(handle);
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

6
 
关闭已打开的线程再去打开新的线程
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

7
 
请教,按道理说没有关闭线程,在线程函数执行完之后就应该自己关闭了!
reply:yzbsd,我是想测试一下多线程的内存溢出,不能再关闭已有线程后再打开新线程。
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

8
 
而且很多资料上都写着让线程自己执行完毕不会造成内存泄漏
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

9
 
记住关闭线程
 
 
 

回复

90

帖子

0

TA的资源

一粒金砂(初级)

10
 
先把线程关闭。
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

11
 
我明白各位的意思,我把程序改成:
按钮事件
void CleakerDlg::OnBnClickedButton1()
{
  HANDLE a = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ReadData, NULL, 0, NULL);
  CloseHandle(a);
}
线程函数
void WINAPI ReadData()
{
for(int i=0;i <10000;i++)
{
    char* aa = new char[1000];
    for(int j=0;j <10000;j++)
    {
    }
    delete [] aa;
  }
}
可是现象还是同样的,感觉和多线程有关。
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

12
 
再看不出有什么问题。

所以,LZ的程序就这些代码吗?可能是其它部分引起的。

第二,从程序实现角度来讲,new 最好不要在for等循环中,放在for等循环的前面分配。
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

13
 
刚才仔细的看了LZ这个问题,发现应该不是LZ所认为的:没有产生内存泄漏,只是产生了内存碎片罢了。

这个和CE的内存管理(回收)机制有关。说起来比较复杂,但应该还可以解释的。
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

14
 
如果LZ连续按键过程中,有一定的时间间隔(具体时间为上次的线程已经退出),则不会产生内存泄漏的。产生这个现象的原因如下:

在CE下内存分配与回收,并没有像PC上一样。能否彻底回收与分配和回收的顺序有关,具体的顺序是按堆栈的顺序,而不是队列的顺序。

举例如下:
若连续分配两块内存,顺序是:内存1和内存2;
free内存时,如果也按顺序:内存和内存2,则会发现内存碎片(从现象上看,好像是产生了内存泄漏)
free内存时,如果按:内存2和内存1,则不会产生内存碎片的。
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

15
 
引用 13 楼 91program 的回复:
如果LZ连续按键过程中,有一定的时间间隔(具体时间为上次的线程已经退出),则不会产生内存泄漏的。产生这个现象的原因如下:

在CE下内存分配与回收,并没有像PC上一样。能否彻底回收与分配和回收的顺序有关,具体的顺序是按堆栈的顺序,而不是队列的顺序。

举例如下:
若连续分配两块内存,顺序是:内存1和内存2;
free内存时,如果也按顺序:内存和内存2,则会发现内存碎片(从现象上看,好像是产生了内存泄漏)
free内存时,如果按:内存2和内存1,则不会产生内存碎片的。


正解,内存碎片很讨厌的。
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

16
 
非常感谢91program兄弟!
    如果不用new的话是不是就不会出现内存碎片了?比如我把new改成定义数组的方式。
void WINAPI ReadData()
{
  for(int i=0;i <10000;i++)
  {
    char aa[1000];
    for(int j=0;j <10000;j++)
    {
    }
  }
}
我把一个vxworks下的程序移植到wince上来的,原有的程序可以不间断运行几个月,在wince下只能运行一天,如果是内存碎片的问题该如何解决呢,wince有没有什么精灵程序可以动态回收的?
另外请教一个初级问题,在我关闭这个进程之后,如果内存仍然恢复不了,那这种现象是内存泄漏还是碎片的问题?
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

17
 
引用 13 楼 91program 的回复:
如果LZ连续按键过程中,有一定的时间间隔(具体时间为上次的线程已经退出),则不会产生内存泄漏的。产生这个现象的原因如下:

在CE下内存分配与回收,并没有像PC上一样。能否彻底回收与分配和回收的顺序有关,具体的顺序是按堆栈的顺序,而不是队列的顺序。

举例如下:
若连续分配两块内存,顺序是:内存1和内存2;
free内存时,如果也按顺序:内存和内存2,则会发现内存碎片(从现象上看,好像是产生了内存泄漏)
free内存时,如果按:内存2和内存1,则不会产生内存碎片的。

大哥太强了
之前曾经看到过这种原因导致的内存可用量减少,但是炸看到这个问题,还没有联系起来,经你这么一说,茅塞顿开
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

18
 
引用 1 楼 91program 的回复:
没有关闭线程

一个HANDLE占用4个字节,即使没有关闭也没事的
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

19
 
学习下……
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

20
 
CloseHandle()只是关闭一个句柄,并不会关闭该句柄对应的线程。。。。
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表