[英]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.