静态分配和动态分配返回不同的答案
statically allocated and dynamically allocated returns different answers
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
之前摧毁它。">
相关文章:
- 为什么C++程序在太大时返回代码而不是答案?
- 函数从指针 c++ 中获取错误的值并返回错误的答案
- set_difference并不总是返回正确的答案
- 阶乘函数只返回C++中输入的答案
- 给定一个整数 N>0,区间 [0, 2^N) 中有多少个整数正好有 N-1 个设置位?编写一个返回正确答案的简短函数
- 静态分配和动态分配返回不同的答案
- 无法将答案从矢量返回到整数
- 基础数学没有返回正确答案
- 为什么返回语句和打印语句返回不同的答案?
- std::string::find 返回错误的答案
- 我想将字符串转换为 Json 格式并返回字符串向量作为答案
- 为什么我的函数返回一个整数,尽管我已经将答案指定为浮点数
- 用于获取以元音和辅音开头的单词数量的程序返回错误的答案
- 我正在尝试编写一个简单的计算程序,但答案一直返回为 0
- 从非初始化的内存中读取每次都会返回不同的答案
- C++ - 整数除以整数返回错误答案
- 具有基本结构的结构数组返回错误的答案
- 奇怪的功能行为C ,没有返回相同的答案
- 无法计算如何从联机答案中返回c++函数的多个值
- 0-1整数背包返回错误答案(动态编程)