c - 使用 OpenCV 数据结构时堆损坏

标签 c gcc opencv mingw

我正在使用带有代码块的 OpenCV 2.1(mingw 下的 gcc)。在我的代码中,我试图(出于某种理智的原因)直接访问 IplImage 数据结构中的图像数据。请引用代码片段以获取更多详细信息:

int main(void)
{
    IplImage* test_image = cvLoadImage("test_image.bmp",CV_LOAD_IMAGE_GRAYSCALE);
    int mysize = test_image->height * test_image->widthStep;
    char* imagedata_ptr = NULL;

    int i   =   0;    
    imagedata_ptr = test_image->imageData;

    char* temp_buff = (char *)malloc(sizeof(mysize));
    memcpy(temp_buff,imagedata_ptr,mysize);

    free(temp_buff);
}

当我运行这段代码时它崩溃了。在 Debug模式下运行它会生成一个 SIGTRAP 是由于堆损坏。起初我怀疑这可能是与编译器相关的问题,因此尝试在 Visual Studio 中运行相同的代码。但它仍然崩溃。这就是我认为它可能是 OpenCV 相关问题的原因。

注意:没有打开其他程序实例,这是我正在运行的唯一代码,这里没有执行任何线程等操作。

等待您的评论。

问候,

苏拉布·甘地

最佳答案

你没有分配足够的内存,这:

char* temp_buff = (char *)malloc(sizeof(mysize))

仅分配 sizeof(int) 字节(可能是 4),这可能比您需要的少很多。然后 memcpy紧接着会将 test_image->height * test_image->widthStep 字节的数据复制到只有 sizeof(int) 字节空间的地方,你现在已经到处涂鸦了你的内存并破坏了你的堆。

我猜你真的想这样说:

char *temp_buff = malloc(mysize);

并且不要强制转换 malloc 的返回值,您不需要它,它可以隐藏问题。

关于c - 使用 OpenCV 数据结构时堆损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6639651/

相关文章:

C Valgrind 条件跳转或移动

检查 DocumentDB 对象是否存在的正确方法

gcc - 在编译文件中包含 mingw 库

c - GCC vs Clang 复制结构灵活数组成员

opencv - Vec3b 不带三个参数吗?

c - 我是否可以通过将变量设为静态来提高性能?

c - 使用 Mac 终端实用程序时 printf 不返回任何内容

c# - OpenCV: src.depth() == dst.depth() && src.size == dst.size 异常

iphone - 适用于 Iphone 应用程序的 OCR

c - MinGW/Eclipse C 构建问题 : cannot find dll