【问题标题】:Heap corruption while using OpenCV datastructure使用 OpenCV 数据结构时堆损坏
【发布时间】:2011-10-02 03:37:08
【问题描述】:

我正在使用带有代码块的 OpenCV 2.1(mingw 下的 gcc)。在我的代码中,我正在尝试(出于某种理智的原因)直接访问 IplImage 数据结构中的图像数据。详情请参考代码sn-p:

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 相关问题的原因。

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

同样等待你的 cmets。

问候,

索拉巴·甘地

【问题讨论】:

    标签: c gcc opencv mingw


    【解决方案1】:

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

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

    【讨论】:

    • 天哪...我现在意识到我的问题的愚蠢以及我错过了什么...你仍然让我成为星期天...非常感谢!!
    • umm And don't cast the return value from malloc 除非编译器强迫你这样做 :) 比尔盖茨说:错误 C2440:'initializing':无法从 'void ' 转换为 'char *' 1> 转换从 'void' 到指向非'void' 的指针需要显式转换
    • @user757808:“'void' 到 'char *'”还是“'void *' 到 'char *'”?第一个意味着您缺少标头,第二个意味着您的编译器已损坏(或处于 C++ 模式),因为您不需要从 void* 显式转换为 C 中的任何其他非函数指针类型。
    • @mu 像往常一样太短,StackOverflow 被我的回复弄乱了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    • 2017-11-13
    • 2010-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多