使用OpenCV数据结构时堆积损坏

时间:2011-07-10 06:37:38

标签: c gcc opencv mingw

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

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

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

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

等待你的评论。

此致

Saurabh Gandhi

1 个答案:

答案 0 :(得分:6)

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

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转换返回值,你不需要它,它可以隐藏问题。