Страницы

Поиск по вопросам

пятница, 31 января 2020 г.

Функция free() не освобождает память

#c


Подскажите, у меня есть вот такая функция в которой используется free():

void removeNode(struct Node** t) {
    int key;
    struct Node ** rm;
    struct Node *replace;
    puts("Vvedite iskomiy key");
    scanf("%d", &key);
    (*rm) = searchKey(*t, key);
    if (rm == NULL) {
        puts("not found");
        return;
    }
    if ((*rm)->llink == 1 && (*rm)->llink == 1) {
        if ((*rm)->p->r == (*rm)) {
            (*rm)->p->r = (*rm)->p->p;
            (*rm)->p->rlink=1;
        }
        else {
            (*rm)->p->l = getLLink((*rm)->p->key, (*rm)->p);
             (*rm)->p->llink=1;
            }
        free(*rm);
        *rm=NULL;
        return;
    }
    if ((*rm)->llink != 1 && (*rm)->llink != 1) {
        if ((*rm)->p->r == (*rm)) {
            (*rm)->p->r = (*rm)->r;
        }
        else (*rm)->p->l = (*rm)->r;
        connectNode(&t,(*rm)->l);
        free(*rm);
        *rm=NULL;
        return;
    }
}


После выполнения этой функции я все равно при обходе дерева могу попасть в этот узел.
Для желающих скомпилить, код я выложил сюда:
http://www.codeshare.io/mmoQg
Для того, что бы попасть в это условие можно выполнить следующую последовательность
действий:

1
15
1
1
35
1
1
45
1
2
45


После этого *tail- указатель на максимальный элемент, должен принять значение NULL
после удаления, но по факту там остается 45...
    


Ответы

Ответ 1



Если почитать документацию на функцию free(), можно увидеть такую строчку: Notice that this function does not change the value of ptr itself, hence it still points to the same (now invalid) location. Перевод: Заметьте, что эта функция не изменяет значение переданного указателя, он указывает на ту же область памяти, но она больше не может быть использована. Тот факт, что аллокатор не очистил значение, располагающееся по адресу, на который указывает указатель tail, не значит, что он не освободил этот участок памяти. Этот участок возвращается в пул свободной памяти и при последующих вызовах malloc он может быть заново выделен. Насколько мне известно, стандарт не гарантирует того, что память, освобождёная при помощи free() будет очищена. Здесь объяснено более подробно.

Комментариев нет:

Отправить комментарий