社区
嵌入开发(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这篇博文阐述的比我清楚,不知道大家有没有遇到类似的问题哦?
...全文
140
12
打赏
收藏
有关CE5.0上的内存泄露问题
在CE5.0上 malloc大量数据时(我这里是MB级),即使在释放时调用了free来释放内存,但是system中的memroy仍然没有减少到最初的水平。 http://blog.csdn.net/norains/archive/2010/02/01/5276668.aspx norains这篇博文阐述的比我清楚,不知道大家有没有遇到类似的问题哦?
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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 Embedded从入门到精通系列课程(4):Windows CE 5.0/Windows Mobile调试与性能优化”中,我们将深入探讨Windows CE 5.0和Windows Mobile操作系统的核心概念,以及如何利用调试工具进行性能调优。...
win
ce5
.0.rar_Backlight_win_wince 5.0_windows ce 5.0_触摸屏
这有助于诊断性能
问题
、内存泄漏,或者关闭不必要的进程以释放资源。开发者可以使用API来获取进程信息,实现更高级的监控功能。 6. **文件win
ce5
.0系统时间、音量及背光、触摸屏校正以及进程查看大集合r**:这个...
Windows
CE5
.0操作系统下基于PXA270的蓝牙驱动的实现.docx
### Windows CE 5.0 操作系统下基于 PXA270 的蓝牙驱动实现 #### 摘要 本文探讨了在 Windows CE 5.0 嵌入式操作系统环境中,利用 Intel PXA270 处理器作为核心硬件平台,实现蓝牙驱动程序的方法。该文针对蓝牙技术...
win
ce5
.0飞机游戏全屏
标题中的“win
ce5
.0飞机游戏全屏”指的是在Windows CE 5.0操作系统上运行的一款全屏显示的飞机游戏。Windows CE是微软开发的一个嵌入式操作系统,广泛应用于掌上设备、工业控制和车载系统等。在CE 5.0版本中,由于...
wince 5.0 ARMV4I 上可以调试的TCPMP源码。。
总之,调试TCPMP源码在Windows CE 5.0 ARMV4I上是一个既具有挑战性又充满乐趣的过程,它需要开发者具备扎实的嵌入式系统知识、C/C++编程基础以及良好的
问题
解决能力。通过不断学习和实践,我们可以更好地驾驭这个...
嵌入开发(WinCE)
19,518
社区成员
41,565
社区内容
发帖
与我相关
我的任务
嵌入开发(WinCE)
硬件/嵌入开发 嵌入开发(WinCE)
复制链接
扫一扫
分享
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章