静态分配和动态分配返回不同的答案

时间:2018-07-19 14:29:49

标签: c++

Mods-请关闭此问题。我在代码中发现了错误。不幸的是,我无法删除它。

以下两个代码段之间是否有区别? 也许关于填充?因为相对于第一个图像(静态分配),我得到了奇怪的图像。第二个没事。

产生失真的图像(我猜是缺少蓝色,并且像素发生了移位)

function1(char *image) { 
 char image_data_[image_info_.imgSize];
 memcpy(image_data_, image, image_info_.imgSize); // 144000 bytes
 cv::Mat color_image_opencv(image_info_.height, image_info_.width, CV_8UC3, image_data_);
 cv::imwrite("image.png", color_image_opencv);
}

AND(此方法有效)

function2(char *image) { 
 char *image_data_ = NULL;
 image_data_ = reinterpret_cast<char*>(malloc(image_info_.imgSize));
 memcpy(image_data_, image, image_info_.imgSize);
 cv::Mat color_image_opencv(image_info_.height, image_info_.width, CV_8UC3, image_data_);
 cv::imwrite("image.png", color_image_opencv);
}

1 个答案:

答案 0 :(得分:1)

我们可以使用心理调试能力来推断您正在从函数返回cv::Mat,或者将其生存期延长到它指向的char数组之外。在malloc()中,用于存储图像字节的内存在显式释放之前是可用的,与之相反,与自动变量相反,一旦图像数据超出范围,就不能使用它。

您使用的cv::Mat构造函数的documentation说:

  

采用数据和步骤参数的矩阵构造函数不分配矩阵数据。相反,它们只是初始化指向指定数据的矩阵头,这意味着不会复制任何数据。此操作非常有效,可用于使用OpenCV功能处理外部数据。外部数据不会自动释放,因此您应该注意这一点。

当然,当他们说“好好照顾”时,并不是说“要在销毁cv::Mat之前销毁它。”