簡體   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