Почему только один free () работает для этого сегмента кода? - PullRequest
2 голосов
/ 21 апреля 2019

Я использую free (), чтобы освободить структуру, которую я выделил ранее, и я хочу проверить, успешно ли они освободились, но я получаю только одну из них, почему?

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef struct student{
    char *name;
    struct student *next;
}student;
int main(int argc, const char * argv[]) {
    student *a=malloc(sizeof(student));
    a->name="echo";
    student *b=malloc(sizeof(student));
    b->name="harry";
    a->next=b;
    b->next=NULL;
    free(a);
    free(b);
    printf("%s\n", a->name);
    printf("%s\n", b->name);
    return 0;
}

и я получил этот вывод. Почему?

(null)
harry
Program ended with exit code: 0

Ответы [ 3 ]

4 голосов
/ 21 апреля 2019

Вы не можете "проверить", были ли они успешно освобождены, попытка получить доступ к любой освобожденной памяти является неопределенным поведением, вместо того, чтобы просто проверять, принимать и двигаться дальше.

2 голосов
/ 21 апреля 2019

У вас есть free d памяти, но это не значит, что указатель был аннулирован системой. Во втором случае данные, на которые они указывали, еще не использовались повторно, поэтому printf находит их и может напечатать.

  • В первом случае память была повторно использована или сброшена. print находит нулевой указатель.
  • Во втором случае память еще не использовалась повторно: printf находит и может распечатать.

Но это неопределенное поведение и все, что могло произойти.

1 голос
/ 21 апреля 2019

Лучше использовать free вместе с установкой переменной на NULL.

free(b);
b = NULL;
free(a);
a = NULL;

Когда вы вызываете free, переменная помечается для повторного сбора. И когда это воспоминание о выделенной памяти должно произойти, это зависит от базовой ОС. Вы не должны получить доступ к освобожденному блоку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...