我如何释放分配给C中指针的内存?

时间:2014-09-10 13:00:25

标签: c pointers visual-studio-2012 struct ansi

我在C中有一个函数,它将一个新问题添加到单链表的头部:

int AddQuestion()
{
    unsigned int aCount = 0;
    Question* tempQuestion = malloc(sizeof(Question));

    tempQuestion->text = malloc(500);

    fflush(stdin);
    printf("Add a new question.\n");
    printf("Please enter the question text below:\n");
    fgets(tempQuestion->text, 500, stdin);
    printf("\n");
    fflush(stdin);
    printf("How many answers are there?: ");
    scanf("%u", &tempQuestion->numAnswers);
    fflush(stdin);
    tempQuestion->answers = malloc(sizeof(Answer*) * tempQuestion->numAnswers);
    for (aCount = 0; aCount < tempQuestion->numAnswers; aCount++)
    {
        tempQuestion->answers[aCount] = malloc(sizeof(Answer));
        tempQuestion->answers[aCount]->content = malloc(250);
        printf("Enter answer #%d: \n", (aCount + 1));
        fgets(tempQuestion->answers[aCount]->content, 250, stdin);
        fflush(stdin);
        printf("Is it correct or wrong? correct = 1, wrong = 0: ");
        scanf("%u", &tempQuestion->answers[aCount]->status);
        fflush(stdin);
    }

    tempQuestion->pNext = exam.phead;
    exam.phead = tempQuestion;

    printf("\n");
    fflush(stdin);

    return 1;
}

如您所见,我使用malloc()来分配新问题所需的空间。但是,如果我尝试在tempQuestion上调用free(),它会从考试中删除问题。除非问题被删除或程序终止,否则我不想删除该问题。

我有一个清理函数应该释放()所有使用过的内存,但它不会释放addQuestion()函数中的tempQuestion。

void CleanUp()
{
    unsigned int i = 0;
    Question* tempQuestion = NULL;

    if (exam.phead != NULL) {
        while (exam.phead->pNext != NULL) {
            tempQuestion = exam.phead;
            exam.phead = tempQuestion->pNext;
            for (i = 0; i < tempQuestion->numAnswers; i++) {
                free(tempQuestion->answers[i]->content);
                free(tempQuestion->answers[i]);
            }
            free(tempQuestion->pNext);
            free(tempQuestion->text);
            free(tempQuestion);
        }
        free(exam.phead);
    }
}

我如何在addQuestion()函数中释放()tempQuestion,以便它只在执行结束时释放内存?我正在使用Visual Studio C ++ 2012,但我必须只使用C语法(没有C ++)编写。我也是C编程的新手。谢谢!

3 个答案:

答案 0 :(得分:1)

回答你的问题:你没有。您不应该在free(tempQuestion)函数中调用AddQuestion,因为这会释放您刚刚分配的内存。

当你指向另一个指针的指针时,它只会被复制的指针,而不是指向的指针。

答案 1 :(得分:0)

在main中为 tempQuestion 分配和释放内存,而不是在AddQuestion函数中分配。

int main ()
{
    Question *tempQuestion = malloc (sizeof (Question));
    .
    .
    .
    free (tempQuestion);
    return 0;
}

这将帮助您在从main返回之前释放 tempQuestion 的内存。

同时在为 tempQuestion-&gt;回答取消分配内存时,你错过了这个

for (i = 0; i < tempQuestion->numAnswers; i++) {
    free(tempQuestion->answers[i]->content);
    free(tempQuestion->answers[i]);
}
free (tempQuestion->answer);

休息应该没问题。

答案 2 :(得分:0)

AddQuestion() tempQuestion的末尾指向exam.phead指向的同一地址,因此CleanUp()为您释放内存。