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