如何在单独的函数中释放指针malloc?

时间:2014-09-10 15:30:16

标签: c pointers visual-studio-2012 malloc free

我有一个名为exam的全局变量,类型为struct Exam:

typedef struct 
{
    Question* phead;
}Exam;

Exam exam;

在函数I malloc空间中指针phead:

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编程的新手。谢谢!

2 个答案:

答案 0 :(得分:1)

你有一个内存泄漏,从关闭:

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',但它不会任何东西 同时,malloc'ed内存将保持分配状态,但您没有指向它的指针,因此无法管理它。你不能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, '\0', 100);

答案 1 :(得分:0)

您在使用exam.phead分配内存后,立即将initExam中的NULL设置为mallocfree()使用NULL指针不做任何事情,因此您会泄漏内存。