我编写了一个简单的 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);
}
}
最佳答案
使用已释放的内存是 C 中未定义的行为。
它在这里起作用是因为在内存被释放后没有任何东西改变它。这通常是在内存被释放后立即出现的情况。像 HeapFree(...)
这样的函数或标准 C free(...)
通常不会将内存归零;它们只是改变运行时管理的内部状态,以便知道内存是空闲的。
关于c - 为什么 HeapFree 之后堆内存仍然可以访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58695491/