我有一个名为exam的全局变量,其类型为structExam:
typedef struct
{
Question* phead;
}Exam;
Exam exam;
在一个函数中,指针phead:的malloc空间
int initExam()
{
exam.phead = malloc(sizeof(Question*));
exam.phead = NULL;
return 1;
}
在一个单独的功能中,我试图释放这个内存:
void CleanUp()
{
unsigned int i = 0;
Question* currentQuestion = exam.phead;
while (currentQuestion != NULL) {
// some other code
}
exam.phead = NULL;
}
我还尝试了以下功能:
free(exam.phead);
我的问题是它似乎没有释放malloc分配的内存。我希望CleanUp()释放exam.phead分配的内存,并且我不能更改函数签名或将free()调用移动到另一个函数。我做错什么了吗?我对C编程还相当陌生。谢谢
您有一个内存泄漏,从关闭开始:
int initExam()
{
exam.phead = malloc(sizeof(Question*));//assign address of allocated memory
exam.phead = NULL;//reassign member, to a NULL-pointer
return 1;
}
exam.phead
成员被分配了您分配的内存的地址,但之后就变成了空指针。空指针可以安全地为free
'd,但它不会做任何事情
同时,malloc
的内存将保持分配,但您没有指向它的指针,因此无法管理它。您不能free
内存,也不能使用它。我认为NULL
分配是试图将内存初始化为"clean"值。有很多方法可以做到这一点,我稍后会了解。
无论如何,由于phead
为NULL,因此以下语句:
Question* currentQuestion = exam.phead;//is the same as currentQuestion = NULL;
while (currentQuestion != NULL) //is the same as while(0)
根本没有道理。
要初始化新分配的内存,请使用memset
或calloc
。后者将分配的内存块初始化为零,memset
可以这样做(calloc
基本上与调用malloc
+memset
相同),但允许您初始化为任何您喜欢的值:
char *foo = calloc(100, sizeof *foo);// or calloc(100, 1);
//is the same as writing:
char *bar = malloc(100);
memset(bar, ' ', 100);
使用malloc
分配内存后,立即将initExam
中的exam.phead
设置为NULL
。free()
对NULL
指针没有任何作用,所以您正在泄漏内存。