2011-07-10 28 views
1

我正在使用OpenCV 2.1和代码块(gcc在mingw下)。在我的代码中,我试图(为了某种理智的原因)直接访问IplImage数据结构中的图像数据。请参阅代码片段以获取更多详细信息:使用OpenCV数据结构时发生堆损坏

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甘地

回答

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

+0

天哪......我现在意识到我的问题的愚蠢以及我错过了什么......你还是让我的星期天......非常感谢! –

+0

umm'不要从malloc投下返回值,除非你被迫编译:) :) 比尔盖茨说: 错误C2440:'初始化':无法从'void *'转换为'char *' 1>从'void *'转换为非'空'的指针需要明确的转换 – Ulterior

+0

@ user757808:“'void'转换为'char *'或''void *'转换为'char *'”?第一个意味着你错过了一个头文件,第二个意味着你的编译器坏掉了(或者是C++模式),因为你不需要从'void *'显式强制转换为C中的其他非函数指针类型 –