Почему куча памяти все еще доступна после HeapFree - PullRequest
0 голосов
/ 04 ноября 2019

Я написал простую программу на C, которая создает односвязный список. Оно работает;например, я выдвинул несколько чисел в список, и функция print_list(...) выводит числа на консоль.

Однако затем я добавил функцию clear_list(...) и вызвал ее до print_list(...), чтобы посмотреть, что произойдет. После вызова clear_list, print_list по-прежнему печатает номера, как и раньше.

Как print_list печатает номера из освобожденной памяти? Я использую HeapAlloc для выделения структуры списка и HeapFree для освобождения.

Код ниже:

static BOOL push_list(DWORD a)
{
    LIST *ptr = NULL;

    ptr = (PLIST)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,     sizeof(LIST));
    if (ptr == NULL)
    {
        printf("Error push list\n");
        return FALSE;
    }

    ptr->i = a;

    ptr->next = LIST_HEAD;
    LIST_HEAD  = ptr;


    return TRUE;
}



void free_dir_list(void)
{
    PLIST pTemp = NULL;
    P_LIST PTR = LIST_HEAD;


    while (PTR != NULL)
    {
        pTemp = PTR;
        PTR = PTR->next;
        HeapFree(GetProcessHeap(), 0, pTemp);
    }
}

1 Ответ

1 голос
/ 06 ноября 2019

Использование освобожденной памяти - неопределенное поведение в C.

Это работает здесь, потому что ничто не изменило память после того, как она была освобождена. Обычно это происходит сразу после освобождения памяти. Такие функции, как HeapFree(...) или просто стандартный C free(...) , не обычно обнуляют память;они просто изменяют внутреннее состояние, управляемое средой выполнения, так что известно, что память свободна.

...