-3

我写了一个简单的 C 程序来创建一个单链表。有用; 例如,我将一些数字推送到列表中,该函数print_list(...)将这些数字打印到控制台。

但是,我随后添加了一个clear_list(...)函数并在之前调用它print_list(...)以查看会发生什么。调用后clear_listprint_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);
    }
}
4

1 回答 1

2

在 C 中使用释放的内存是未定义的行为。

它在这里工作,因为在内存被释放后没有任何改变。这通常是在内存被释放后立即出现的情况。像HeapFree(...)或只是标准 C 的函数通常free(...) 不会将内存归零。它们只是改变运行时管理的内部状态,这样内存就被认为是空闲的。

于 2019-11-06T17:34:31.830 回答