找了两个小时的问题,记录一下, 在ROS下usb_cam节点下添加了新的去畸变函数,并将其发布成topic,但是在实际运行的时候,有时候会出现段错误,debug模式提示如下:

__memcpy_avx_unaligned () at ../sysdeps/x86_64/multiarch/memcpy-avx-unaligned.S:238

可以定位到我代码中的memcpy()函数, 其实是ROS下的sensor_msgs::fillmage()的

memcpy(&image.data[0], data_arg, st0);

用gdb调试了解到,这里是将data_arg中的内容拷贝到image.data中时,出现data_arg这块内存无法访问, 而data_arg其实是一个cv::Mat的data;

由此定位到了这段函数:

void UsbCam::undistort_image()
{cv::Mat ori_img,dst_img;int img_size; if(monochrome_){ori_img=cv::Mat(image_->height,image_->width,CV_8UC1,image_->image);img_size = image_->width*image_->height;}else{ori_img=cv::Mat(image_->height,image_->width,CV_8UC3,image_->image);img_size = image_->width*image_->height*3;}cv::remap(ori_img,dst_img,mat_mapx,mat_mapy,cv::INTER_LINEAR);undistort_image_->width = dst_img.cols;undistort_image_->height = dst_img.rows;undistort_image_->image = reinterpret_cast<char*>(dst_img.data);if(dst_img.empty())ROS_INFO_STREAM("dst_img is empty ");
}

上面的函数定义了 ori_img 和 dst_img两个cv::Mat, 对ori_img在赋值之后进行了去畸变操作,去畸变后的图像保存在dst_img中,随后又将dst_img的图像数据,即data保存到undistort_image->image中,但是这里的保存仅仅是将undistort_image->image的指针指向了ori_img.data的地址,并没有进行内存的拷贝,同时dst_img又是这个函数的局部变量,在退出该函数的时候cv::Mat的析构函数会自动释放dst_img对应的内存,因此,等到外面在访问这块内存进行memcpy的操作时,会出现访问不到内存,导致memcpy出错。

这里的修改方式为将 

undistort_image_->image = reinterpret_cast<char*>(dst_img.data);

修改为:

  memcpy(&undistort_image_->image[0], dst_img.data, img_size);

将内存通过memcpy拷贝进来,从而避免dst_img的内存被释放时,也相当于释放了undistort_image->image对应的内存; 同时我的undistort_image->image因为是事先申请好了一块内存的, 就应该进行这样的深拷贝,而不是直接将将指针指向对应的地址;

关于深拷贝和浅拷贝参考C++的深拷贝和浅拷贝; 对于像cv::Mat这样的类,其中的data中的数据(指针类型),只有执行深拷贝,才能保证新保存的数据与Mat中的data相互独立,否则,一旦元数据被释放,新保存的数据也不存在了;

当然,我这里的根源问题,并不在于memcpy(), 而是在于错误地将指针指向局部变量的内存地址, 如果有小伙伴在使用memcpy()时出现了问题,也可以试一下将memcpy()替换掉,自己写一个for循环进行拷贝,看一下还会不会有错;

这是我中间的debug过程,发出来分享一下:

    image.data.resize(st0);image.data.clear();//将我原来为image.data申请的内存先清除掉char *pdata = (char *)data_arg;//做一个类型转换,不重要printf("image.data = %d   %d %d \n", &image.data[0], image.data.capacity(), data_arg);for (size_t i = 0; i < st0; i++){ image.data.push_back((char)pdata[i]);//替换memcpy(),自己手动copy}

不一定能解决问题,但是可以作为一个Debug的思路。

:)

使用memcpy()时报错相关推荐

  1. CentOS7 service network start命令启动时报错解决方法

    service network start命令启动时报错: [root@localhost network-scripts]# service network start Starting netwo ...

  2. linux怎么卸载webpack,安装webpack后,执行webpack -v命令时报错:SyntaxError: Block-sc

    安装webpack后,执行webpack -v命令时报错如下: [root@FreeServer ~]# webpack -v /usr/local/node-v4.4.7-linux-x64/lib ...

  3. 下载最新版本Maven 3.3.9 ,检测安装是否成功时发现Java版本JDK却低于1.7时报错

    下线最新版本Maven 3.3.9 ,检测安装是否成功时发现Java版本JDK却低于1.7时报错 cmd: mvn -v Exception in thread "main" ja ...

  4. debug:g2o cmake时报错“Qt5 not found. Install it and set Qt5_DIR accordingly

    ** debug:g2o cmake时报错"Qt5 not found. Install it and set Qt5_DIR accordingly" ** 完整报错: @ubu ...

  5. 【Ubuntu】制作usb启动盘安装ubuntu18.04时报错:“failed to load ldlinux.c32”

    1.问题描述 使用UltraISO制作ubuntu18.04操作系统的usb启动盘后,按照时报错: failed to load ldlinux.c32 ubuntu16.04.ubuntu14.04 ...

  6. 【Cmake】执行cmake命令时报错:No XSLT processor found

    一.问题描述 在ubuntu中,在生成Doc(文档)中,执行cmake命令时报错:No XSLT processor found 二.原因查找 google该错误信息,原因是确实ubuntu中没有安装 ...

  7. 【Qt】启动QtCreator时报错:Cannot mix incompatible Qt library (version ) with this library (version...

    1.问题描述 当启动QtCreator时报错(我的Qt版本是Qt5.6.3): Cannot mix incompatible Qt library (version 0x50603) with th ...

  8. 【linux】在CentOS7上更改端口号时报错:Job for sshd.service failed because the control process exited with error

    1.问题描述 在在CentOS7上更改端口号时报错: Job for sshd.service failed because the control process exited with error ...

  9. 【Qt】Qt中使用ssl时报错:qt.network.ssl: QSslSocket: cannot resolve SSLv2_client_method

    一.问题 在Qt中使用https,运行时报错: qt.network.ssl: QSslSocket: cannot resolve SSLv2_client_method 二.原因分析 SSLv2由 ...

最新文章

  1. 为防止员工带薪拉屎,快手公司推出“计时厕所”?官方称只是为了测试!
  2. C++STL常用排序算法
  3. 46 CO配置-控制-利润中心会计-创建虚拟利润中心
  4. linux nslcd服务,CentOS 6通过ldap集成AD域账号(nslcd方式)
  5. Spring容器创建流程(9)完成创建
  6. Kudu :主键冲突 status=Already present: key already present
  7. usb接口供电不足_主板接口不认识?一分钟带你了解电脑主板接口
  8. flask-sqlalchemy Multiple Databases
  9. php去掉字符串的最后一个字符的方法
  10. 基于yaf+yar微服务解决方案教程
  11. 利用EXP/IMP进行数据迁移,如何转换表空间操作(完整版)
  12. 5-vue-template模板制作
  13. JAVA日常游玩-----用EnumMap优化代码。
  14. OpenGL二维纹理映射(2D textures)
  15. usb接口多少钱_3分钟搞懂USB
  16. 百度地图开发(安卓)
  17. 如何将网页保存保存为PDF格式?或者打印网页
  18. React脚手架创建项目
  19. 4G/5G多链路聚合路由器对不同运营商聚合适用的工作场景
  20. 深度卷机网络(Deep CNNs)的GFLOPS与参数量计算

热门文章

  1. opencv 图像傅里叶变换
  2. 图像仿射变换之图像旋转 python
  3. [paper reading] CenterNet (Object as Points)
  4. [深度学习] 池化层函数及其逆过程函数
  5. python机器学习案例系列教程——文档分类器,朴素贝叶斯分类器,费舍尔分类器
  6. JS 监听绑定和取消事件
  7. callback的实现
  8. 昆特牌Online——客户端用到的一些技术
  9. [转载] python 列表List中index函数的坑
  10. [转载] python eval序列化函数