读书人

malloc分配失败。虚拟内存一直很高。解

发布时间: 2012-09-23 10:28:10 作者: rapoo

malloc分配失败。虚拟内存一直很高。
大家好。
我这里有个扫描仪的程序,程序启动不工作时大约占用200M的内存,扫描图的时候会分配400M的空间,已用来存图片的内存。现在遇到的问题是在扫描些小的图时还比较正常。但是一旦扫很大的图就会崩溃。扫图时会调用一个库,这个库会根据图再次malloc 在malloc时分配失败。
希望大家帮帮忙,分可以追加。

[解决办法]
可以有这么个思路:
如果没有办法改那个库,那就改自己的代码
如果内存占用太多,可以考虑缓存一下,将扫描的图片分成片,然后存盘,最后对文件操作。不要都放到内存中做
[解决办法]
既然你在资源足够的情况下,那一楼的方案可能不适合。我觉得应该从图片入手,把它的大小压缩变小一点,在进行扫描。
[解决办法]
将malloc改为CreateFileMapping

[解决办法]
那你可以做一个测试,看看多大的图,才能造成测试失败!!找出那一个点!!

如果是库的问题就不能改变 ,只能分块来实现了!!然后再合并成完整的
[解决办法]
malloc 失败一般不会是内存覆盖引起的
这种情况多半是内存泄漏或者是内存碎片,必须用工具调试分析才能确定
关于内存泄漏 可以使用umdh分析,或者使用leakdiag
分析内存还可以使用windbg的!address指令以及!heap等指令
当然以上工具必须保证符号表全,包括调用的那个库的符号表
valgrind也是不错的工具,但是我没用过windows版的,不知道windows上表现如何
以上工具具体用法不便详述,可以看软件帮助文档或者google一下

[解决办法]
黑盒分析真不如直接用调试工具调试来得快
内存问题直接挂上内存分析工具可能很快就解决了
是不是泄漏或者又是不是碎片引起的用工具分析下不是更直接简单?
malloc并不真正向操作系统申请内存,实际上是向进程的heap manager申请内存,所谓malloc不过是heap manager把内存标记为commit状态,free就是执行个decommit操作,heap manager管理的内存不够向系统申请内存,但是他不会把内存还给系统。我们说所的申请内存并不是一定就是申请了物理内存,而更多的是一个地址空间,这也是物理内存充沛但是,碎片过多,会引起分配失败的原因
[解决办法]
心情可以理解

提有个问题,那个malloc失败是只要扫描那种特定格式的图片就会失败,哪怕之前没有做过其他任何操作,这是程序启动后扫描的第一个图片?

[解决办法]
如果觉得autosize这个库有问题可以测试不调他,看你的描述他就是返回一个尺寸信息,去掉这个调用,自己设置一个固定值,排除它的问题
[解决办法]

探讨
引用:
将malloc改为CreateFileMapping


有没有比较好的介绍文件映射的文章 ,推荐个。

[解决办法]
http://blog.csdn.net/robertbaker/article/details/6362012
也许有帮助,
[解决办法]
要不你留 QQ 也行,我有验证消息的,

读书人网 >C++

热点推荐