c语言 - 如何在单独的函数中释放指针错误?



我有一个名为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)

根本没有道理。

要初始化新分配的内存,请使用memsetcalloc。后者将分配的内存块初始化为零,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设置为NULLfree()NULL指针没有任何作用,所以您正在泄漏内存。

相关内容

  • 没有找到相关文章