为什么堆内存在HeapFree之后仍然可以访问

时间:2019-11-04 14:29:22

标签: c windows winapi heapalloc

我写了一个简单的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 个答案:

答案 0 :(得分:2)

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

之所以在这里起作用,是因为在释放内存后没有任何改变。这通常是在释放内存后立即发生的情况。像HeapFree(...)之类的功能或仅是标准C free(...) 之类的功能通常不会将内存清零。它们只是更改了运行时管理的内部状态,因此已知内存是可用的。