繁体   English   中英

释放内存时程序冻结

[英]Program freezes when freeing memory

我有一个具有释放结构内存功能的程序。 它通常可以正常工作,但有时会冻结。

这是我要释放内存的结构:

struct Image {
   unsigned int height;
   unsigned int width;
   unsigned int maxvalue;
   unsigned int *imgdata[];
};

这是释放内存的功能(printfs仅用于检查其冻结位置)

void    Image_Delete (Image *img)
{
    printf("1");
    free(img->imgdata);
    printf("1");
    free(img);
    printf("1");
}

有时这可以正常工作,但通常程序会冻结为free(img); 我的Image_Delete函数是否存在任何错误?

这是我的img和img-> imgdata的malloc行

Image *img= (Image*)malloc(sizeof(Image*));
img->imgdata[height*width]= (unsigned int*)malloc(height*width*sizeof(unsigned int*));

您的第一个malloc没有分配足够的空间:

Image *img= (Image*)malloc(sizeof(Image*));

这样可以为“图像指针”分配足够的空间,但是您将使用它作为“图像”,它是3个整数和一个指针。 因此,当您开始修改新分配的“图像”时,最终将覆盖任意内存。 另外,您的free(img->imgdata)调用使用的指针不包含在img的分配空间中,因此可能已被程序的其他部分修改了; 调用malloc未返回的值上的free可能会导致malloc内部状态的任意破坏,因此很可能发生任何事情。

这是一个提示。 最好的样式是始终像这样编写您的malloc:

Image *img = malloc(sizeof *img);

使用*variable而不是重复类型更不容易出错,尽管您最终仍然会重复变量名,所以它不是完美的。 而且没有必要强制转换malloc返回的void *。

另外,要回答您在注释中提出的问题:在NULL上调用free总是安全的,但否则只能在malloc返回的指针上调用它。 因此,如果您不打算立即填写img->imgdata ,则应将其清除为0。实际上,使用calloc代替malloc会更好。 对于像Image这样的小对象,开销可以忽略不计。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM