【发布时间】:2013-09-23 01:33:34
【问题描述】:
我有一个具有释放结构内存功能的程序。它通常工作正常,但有时它只是冻结。
这是我试图释放内存的结构:
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 img 和 img->imgdata。也许你不止一次地释放它?
-
我认为我不会多次释放它。我想我意识到了一个问题。 imgdata 并不总是分配给它的内存。释放尚未分配的内存会导致这种类型的冻结吗?如果是,如何检查内存是否已分配给 imgdata?
-
是的,这会导致未定义的行为。跟踪内存是否已分配给指针的一种方法是在第一次机会时将指针设置为 NULL,保持这种状态,直到您为其分配内存,然后在释放该内存时将其设置回 NULL。
标签: c