VC 内存问题

liyangfml 2011-03-18 12:54:27
额,,在发这个帖子之前我想了很久该如果问这个问题,并在那个板块问,其中问题大致如下:
在用VC开发图像处理算法时我发现,此程序由两张图片作为输入,大小为1944*2592,在处理过程中需要对两幅图像各自备份24*2=48份,在VC中我用double型1944*2592数组来存储备份数据,也就是说需要1944*2592*48*4字节,也就是需要大约1G内存(非计算机科班出生,不知道计算是否正确),结果计算机卡死,运行直接弹出“out of error”,但是同样的程序(对应的matlab程序),运行起来不但没有死机,而且2秒不到就出结果,请问,我到底在VC中犯了什么致命的错误,,,到底问什么内存如此耗费,,,是不是和堆栈的概率有关系,,,请高手指教!
...全文
73 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
贪食蛇男 2011-03-18
  • 打赏
  • 举报
回复
C的内存模型很简单,在WINDOWS下,32位,低2G是用户进程使用,除去DLL,EXE映象区,低64K区,数据区,共有大约1。8G的可分配内存。
如果是 malloc(),检查返回值是否为空。如果为空,说明没有足够的内存来分配了,这时候返回的是0,这个时候没检查返回值就使用,这个空指针必然错误。
这样,你每次 malloc时把 malloc的内存大小累加起来,并且检查返回值,看最后分配了多少,是不是堆用尽。记得释放。
贪食蛇男 2011-03-18
  • 打赏
  • 举报
回复
"在VC中我用double型1944*2592数组来存储备份数据,也就是说需要1944*2592*48*4字节,"这话,意思是 malloc的内存?如果在栈上,编译都过不了才对吧……
delphiwcdj 2011-03-18
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 liyangfml 的回复:]

哦??就是啊,,,我也知道申请了很多,但是我想的问题是,为什么MATLAB程序可以很流畅的执行完整,而且在执行完之前我特别设置断点发现,这么多的滤波图像备份,它都可以实时调用查看,,,而我用VC写的程序却死机,溢出,忘高手指点
[/Quote]
matlab底层实现不一样,它本来就是基于矩阵的。32位VC下double为8字节,你一次申请这么大的空间内存不够的话就会报错。把算法修改一下,需要的时候再申请,并且在使用完后立刻释放。
luciferisnotsatan 2011-03-18
  • 打赏
  • 举报
回复
通常做这个会优化的,一块一块处理,不会一起放内存里吧
liyangfml 2011-03-18
  • 打赏
  • 举报
回复
哦??就是啊,,,我也知道申请了很多,但是我想的问题是,为什么MATLAB程序可以很流畅的执行完整,而且在执行完之前我特别设置断点发现,这么多的滤波图像备份,它都可以实时调用查看,,,而我用VC写的程序却死机,溢出,忘高手指点
bdmh 2011-03-18
  • 打赏
  • 举报
回复
你这一次申请4G内存,除非你内存或者虚拟内存有足够的连续空间,否则申请将失败
liyangfml 2011-03-18
  • 打赏
  • 举报
回复
额,,需要高斯滤波,建立高斯尺度空间,所以需要DOUBLE型的,用的矩阵库是网上流行的CMatrix
Ihatec2s3d4n5 2011-03-18
  • 打赏
  • 举报
回复
你一次申请1944*2592*sizeof(double)那么多字节,循环申请24*2=48次,每次申请到一个缓冲区就检查返回的指针是不是空的.如果看到是空的就不能再申请了.
另一个问题,什么样的图像需要double来存储呀

3,882

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧