2013-09-23 62 views
1

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

这是我想免费为内存结构:

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->我的malloc线imgdata

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

这是从多个线程调用? –

+0

你的代码看起来不错。这将有助于了解你的malloc img和img-> imgdata。也许你不止一次地自由了? –

+0

我不认为我不止一次地释放它。尽管如此,我认为我发现了一个问题。 imgdata并不总是有分配给它的内存。释放未分配的内存会导致此类冻结?如果是这样,我该如何检查内存是否已经分配给imgdata? – user2805460

回答

1

你的第一个malloc不分配足够的空间:

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

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

这是一个提示。最好的风格是永远写你mallocs这样的:

Image *img = malloc(sizeof *img); 

使用*variable而不是重复的类型是非常不易出错,虽然你最终仍重复的变量名称,因此它并不完美。并且没有点投射malloc返回的void *。

另外,回答您的评论提出的问题:它总是安全地调用freeNULL,但除此之外,你只能把它上被malloc返回一个指针。因此,如果您不打算立即填写img->imgdata,则应将其清除为0.实际上,使用calloc而不是malloc会更好;在像Image这样的小对象的情况下,开销可以忽略不计。

+0

非常感谢! – user2805460