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

statically allocated and dynamically allocated returns different answers

本文关键字:答案 返回 分配 动态分配 静态      更新时间:2023-10-16

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);
}

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);
}

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

您正在使用的cv::Mat构造函数的文档中写道:

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

当然,当他们说"小心"时,他们的意思并不是"在摧毁cv::Mat之前摧毁它。">