内存重叠问题分析与解决方案

 
在编写图像识别模块时,遇到了一个莫名的大问题,(如代码所示)
unsigned  char   * image0,  * image1;
image0 
=  get_image_from_camera(...);
image1 
=  get_image_from_camera(...);
以上代码是连续拍摄两张照片,但奇怪的是,拍摄完毕时发现,image0保存的图片内容和image1的内容竟然完全相同!!!!太不可思议了。首先,通过如下代码排除了获取照片错误的问题:
 
image0  =  get_image_from_camera(...);
write_jpeg(image0...);
image1 
=  get_image_from_camera(...);
write_jpeg(image1...);
以上代码的含义是拍摄下图片后立即保存为jpeg文件,这样我就能检测两张图片是否内容相同,不出所料,检测结果显示两个jpeg文件的图片内容是完全不同的。但即使是这样,在以上操作后,依旧发现image0和image1指向的图片内容相同。似乎是中邪了,保存的jpeg文件内容不同,但是指针指向的却是相同的内容(都是image1的内容,也就是后一张图片)。然后想着,是不是在获取image1的同时,把image0的内存区域给覆盖了,这个是很有可能的,那么这个问题就100%出在get_image_from_camera函数中。打开这个函数的定义发现:
char * map;
...
map 
=
 malloc(...);
...
return (map);
 
这个就和我想的不一样了,这个函数非常正确,它在获取图像时,是采用了动态内存分配,并且返回内存区域的首地址,这样的话,就根本不可能会出现内存覆盖的现象。至此,这个问题一直困扰了我半个星期,一点进展都没有,大脑一团浆糊,唯一想的就是中邪了。
然后,就在n天后,吃饱了撑的,在校园里走着,忽然脑袋里想起了我们在用户空间中的内存地址都是虚拟内存地址,也就是需要通过内存映射,才能够访问到物理地址的。那么这样的映射关系到底是什么关系呢?第一个闪现的就是一一映射,也就是说只允许唯一的虚拟地址去映射唯一的物理地址。那么到底有没有其它的可能性呢?一对多?这个马上被否定了,因为假如一个虚拟地址能够映射多个物理地址的话,根本是不可能实现的,因为操作系统无法分清某一时刻这个虚拟地址到底要映射到哪个物理地址上。那么多对一呢?也就是说多个虚拟地址可以映射到唯一的物理地址上?也就是说通过不同的虚拟地址,我们可以访问同一个物理地址。这个可行。忽然间就豁然开朗,考虑到项目上出的那个奇怪的问题,会不会是image0和image1同时映射到了相同的物理地址上?
以上分析确实有硬伤,当时没怎么细想,解决方案可行,并且没有大问题,就记了下来,……其实,通过共享内存的方式很容易就能实现,动态分配的内存映射到进程地址空间的同一位置,比较郁闷,没想到这一点,一开始以为是分配的内存在内核空间直接映射到了camera的缓存里……后来,也证实了共享内存的这个想法,就此改正。
但是由于时间关系,没能确实的验证,但是基于这个不晓得是对是错的设想,却很容易的想出了解决问题的办法,代码缩写如下:
image0  =  get_image(...);
image0_tmp 
=  (unsigned  char   * )malloc(image_size);
memset(image0_tmp, 
0 , image_size);
memcpy(image0_tmp, image0, image_size);
image1 
=  get_image(...);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
-判断矢量边缘实现不规则物品碰撞检测(非位图) -高效位图碰撞及重叠矢量检测 -A星,深/广度,2D/3D/路点,寻路方式统一处理。 -二次贝尔法曲线,按长度切割和计算法线,光滑曲线拟合(过点或者不过点) -SWF解析器,从ByteArray中播放声音,直接控制AVM1的动画类容。 -丰富的文本缓动,部分文字Filter,渐变色文字,字符差异对比,ANSI转码,URL解码,中文数字,拼音码,这是一个单独的底层包 -完全由FLASH实现的拼音输入法,需要加载200K的词库,光标跟随并可词语输入(感觉和智能ABC差不多) -缩略图,倒影,梯形变换,马赛克,各种特效,火焰什么的 -完整功能的自定制过渡,不仅能用,也能创造。如果不会用,可以使用Creater中的模板 -粒子,物理,景深 -像QQ那样截屏! -流方式读取文本和图片。HTML可以,FLASH也可以 -和FXG类似的道理,用对象保存绘制操作,简化绘制过程 -多种拖拽工具,变形工具,编辑形状工具。单个拖动点也可单独使用。 -单文件自加载 -右键,双击,三击,键盘管理,鼠标手势 -影子生成器。FLASH也是可以模拟出效果不错的光影的。影子可以折墙壁 -防客户端修改解决方案内存修改,加速) -切割图形,同时支持矢量,位图,而且,你可以按45度角来切! -颜色模式转换 -去背景,魔法棒 -图文混排的简单实现。也可以显示Table表格 -滤镜代理:修改了滤镜的属性便能立即生效,你可以直接对它Tween!当然,水波放大镜,对比度饱和度顺便也提供了。 -常用的JS扩展:IFrame,便捷的提供接口给外部JS,调用浏览器音乐播放器播放MID,以及一些常用的防刷新,防鼠标滚轮干扰。当然,deeplink是不可少的。 -扇形,圆环,虚线 -四则运算(字符串分析

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值