У меня есть функция в C, который добавляет новый вопрос к главе односвязного списка:Как освободить память, выделенную указателю в 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;
}
Как вы можете видеть, я использую таНос(), чтобы выделить пространство, что нужно для нового вопроса , Однако, если я попытаюсь вызвать free() на tempQuestion, он удалит вопрос с экзамена. Я не хочу удалять вопрос, если вопрос не будет удален или программа не завершится.
У меня есть функция очистки, которая должна освобождать() всю используемую память, но она не освобождает tempQuestion в функции addQuestion().
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);
}
}
Как бы я освобождаю() tempQuestion в моей функции addQuestion(), так что он освобождает только память, когда исполнение заканчивается? Я использую Visual Studio C++ 2012, но мне приходится писать только синтаксис C (нет C++). Я довольно новичок в программировании на C. Благодаря!
Обратите внимание, что технически 'fflush (stdin)' не определено, это допускается некоторыми реализациями как расширение, но это явно неопределенное поведение в спецификации C. –
Кроме того, в C [вы не должны бросать возврат 'malloc'] (http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc). –
С синтаксисом «Си» вы технически не хотите бросать 'malloc', но вы * должны * при компиляции C++. – crashmstr