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

标签 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);
    }
}

最佳答案

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

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

关于c - 为什么 HeapFree 之后堆内存仍然可以访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58695491/

相关文章:

Java 程序作为 Windows 服务

c# - 复制粘贴后台工具

windows - 是否可以在 Visual Studio 中构建 Monotouch 应用程序?

c++ - 如何更改控制台字体大小

c++ - 文件映射的工作原理

c - Scanf() 不等待整数输入

c - 'true' 的多重定义 - 但不是吗?

winapi - 如何在 TCM_SETCURSEL 消息后更新选项卡的内容

c - GTK+ GTkStatusIcon 在 Win32 中不起作用

c - C 中的日期格式 dd.mm.yyyy