社区
嵌入开发(WinCE)
帖子详情
有关CE5.0上的内存泄露问题
jw212
2010-06-11 10:08:29
在CE5.0上 malloc大量数据时(我这里是MB级),即使在释放时调用了free来释放内存,但是system中的memroy仍然没有减少到最初的水平。
http://blog.csdn.net/norains/archive/2010/02/01/5276668.aspx
norains这篇博文阐述的比我清楚,不知道大家有没有遇到类似的问题哦?
...全文
212
12
打赏
收藏
有关CE5.0上的内存泄露问题
在CE5.0上 malloc大量数据时(我这里是MB级),即使在释放时调用了free来释放内存,但是system中的memroy仍然没有减少到最初的水平。 http://blog.csdn.net/norains/archive/2010/02/01/5276668.aspx norains这篇博文阐述的比我清楚,不知道大家有没有遇到类似的问题哦?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
12 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
wang19847277
2010-06-11
打赏
举报
回复
我用CE5,用SQLCE2.0数据库,长时间后,系统容易死掉,是不是内存问题呢,我释放了啊
[Quote=引用 4 楼 nommm 的回复:]
我曾经遇到过一个情况,不知道是不是一样的问题。
我用CreateBitmap创建位图,显示完了以后用CloseHandle,但是内存使用没有减少。
[/Quote]
seu_dust
2010-06-11
打赏
举报
回复
mark,学习。
nommm
2010-06-11
打赏
举报
回复
[Quote=引用 4 楼 nommm 的回复:]
我曾经遇到过一个情况,不知道是不是一样的问题。
我用CreateBitmap创建位图,显示完了以后用CloseHandle,但是内存使用没有减少。
[/Quote]
我用的是WinCE6,位图大小基本上是100多k的大小
nommm
2010-06-11
打赏
举报
回复
我曾经遇到过一个情况,不知道是不是一样的问题。
我用CreateBitmap创建位图,显示完了以后用CloseHandle,但是内存使用没有减少。
jonsenwu
2010-06-11
打赏
举报
回复
MB级的数据我一般都是在BIB中保留一块地方专用,
jw212
2010-06-11
打赏
举报
回复
推荐nbcool一篇博文,里面提到了分离堆的使用
http://blog.csdn.net/nbcool/archive/2005/12/14/552406.aspx
PS:很奇怪和我看过的一本书内容相似度很高的,我都有些怀疑了,呵呵
里面写的是独立堆,内容一样了
,主要是以下几个函数
HANDLE HeapCreate (DWORD flOptions, DWORD dwInitialSize,
DWORD dwMaximumSize);
LPVOID HeapAlloc (HANDLE hHeap, DWORD dwFlags, DWORD dwBytes);
BOOL HeapFree (HANDLE hHeap, DWORD dwFlags, LPVOID lpMem);
jw212
2010-06-11
打赏
举报
回复
这里是在本地堆中分配内存,在一篇文章中看过,
Windows CE5.0只支持堆中固定块的分配,这样随着时间的推移,多次创建释放内存块,堆内就会产生大量的内存碎片。
而针对碎片的解决,文章只是说
程序员如果要频繁的在堆中创建、释放内存块的话,最好自己创建一个单独的堆,而不用默认的堆。
也就是说CE没有内存碎片回收机制。
看来这部分要自己实现了。
参加讨论者均有分数,谢谢!
jw212
2010-06-11
打赏
举报
回复
刚才发现是指针传错了,汗一个。
private heap果然不是盖的,经验证,是可以将这部分内容(8MB)free成功的。
对于频繁操作的分配小块内存,还是推荐用heap吧。
代码里还有1MB的内存没有释放掉,继续找
jw212
2010-06-11
打赏
举报
回复
今天试验了下heap方式。
代码里主要部分是
一个512大小的指针数组,每个指针指向一个4KB的内存,这样算下来大概分配512*4*4K=8MB 的内存。
原来是用malloc的方式,今天改成了private heap方式:
首先HeapCreate(0, 1024*10, 0); 创建一个堆,初始大小10k,设置成heap自动增加容量。
然后在每个循环里面替换malloc
HeapAlloc(hHeap, HEAP_ZERO_MEMORY, 4096);在堆里每次分配一个大小4k的内存块。
最后在释放时替换free
在循环里面HeapFree(hHeap, 0, handle);handle是heapalloc返回的句柄。
然后销毁堆
HeapDestroy(hHeap);
但是结果并没有真正释放掉所申请的内存,不知道是否heap的使用方式有问题。
EElleevveenn
2010-06-11
打赏
举报
回复
不懂,学习一下
ruritanian
2010-06-11
打赏
举报
回复
这个问题其实很容易解释:
用malloc,new这样的函数分配的内存都是在进程的缺省heap上的。系统缺省的heap是不会也不应该在调用free或者delete的时候释放实际内存空间的,它只是将这段空间释放出来供应用程序以后使用。也就是说这里的heap是进程自己管理的一块内存块,所有的申请和释放都是这块内存块内部的管理。如果里面的空间不够了,那么它会继续申请实际的内存。如果里面的空间多了,那么它不会减少实际的内存,而只是预留在哪里给以后用。
知道了这一特性以后,你就可以有针对性地使用了。建立自己的heap是一种手段(HeapCreate),自己申请实际内存自己管理也行(VirtualAlloc),本质上这和使用heap没有区别,或者你也可以用shared memory(CreateFilemapping).
91program
2010-06-11
打赏
举报
回复
[Quote=引用 7 楼 wang19847277 的回复:]
我用CE5,用SQLCE2.0数据库,长时间后,系统容易死掉,是不是内存问题呢,我释放了啊
[/Quote]
这种情况,极有可能是内存的问题
Windows Embedded从入门到精通系列课程(4):Windows CE 5.0/Windows Mobile调试不性能优化
通过认识Windows CE系统架杴和运行机制,结合相应的调试工具和分杵手段,定位系统瓶颈和
问题
点。
win
ce5
.0.rar_Backlight_win_wince 5.0_windows ce 5.0_触摸屏
wince 系统时间、音量及背光、触摸屏校正以及进程查看大集合r
Windows
CE5
.0操作系统下基于PXA270的蓝牙驱动的实现.docx
Windows
CE5
.0操作系统下基于PXA270的蓝牙驱动的实现.docx
win
ce5
.0飞机游戏全屏
win
ce5
.0下全屏的飞机游戏.下载用用就知道
wince 5.0 ARMV4I 上可以调试的TCPMP源码。。
wince 5.0 ARMV4I 上可以调试的TCPMP源码。。不知道作者做了什么修改,希望大家可以讨论讨论
嵌入开发(WinCE)
19,524
社区成员
41,565
社区内容
发帖
与我相关
我的任务
嵌入开发(WinCE)
硬件/嵌入开发 嵌入开发(WinCE)
复制链接
扫一扫
分享
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章