我使用OpenCV 2.1与代码块(gcc under mingw)。在我的代码中,我试图(出于某种同样的原因)直接访问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);
}
当我运行这段代码时它崩溃了。在调试模式下运行它时,由于堆损坏,它会生成SIGTRAP。起初,我怀疑这可能是编译器相关的问题,因此尝试在Visual Studio中运行相同的代码。但它仍然会崩溃。这就是为什么我觉得这可能是一个与OpenCV相关的问题。
注意:没有其他程序实例打开,这是我正在运行的唯一代码,没有线程等在这里完成。
等待您的评论。
问候,Saurabh甘地
您没有分配足够的内存,这:
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
的返回值,你不需要它,它会隐藏问题。