struct element {
unsigned long int ip;
int type;
int rtt;
struct element * next;
struct element * edge;
};
我有一个链表。我使用 malloc 创建新节点。 我尝试使用 free (ptr to node) 释放内存 但是当我再次运行 traverse 函数时,我可以遍历链表并且 rtt 值以及 next 和 edge 指针都是正确的,因为我可以跟随链表。只有 ip 值已损坏。这是为什么?
最佳答案
malloc()
和 free()
的行为在很大程度上取决于您使用的操作系统和 C 库。在大多数实现中,实际上有两个内存分配器在起作用:
操作系统内存分配器,它使用处理器的虚拟内存设施为进程提供自己的地址空间,并将物理内存页映射到该地址空间以供使用。
C 库内存分配器,它实际上是应用程序代码的一部分,并使用操作系统提供的页面来提供细粒度的内存管理设施,由
malloc()
和free()
。
通常,调用 free()
会执行以下一项或多项操作:
它在 C 内存分配器中将指向的内存区域标记为空闲。这允许重新使用该内存。
free()
不会将释放的内存清零。它可能将内存返回给操作系统,这取决于 C 内存分配器的设置以及是否实际上可以释放那部分堆。如果内存没有返回给操作系统,它可以被同一应用程序 future 的
malloc()
调用重用。
如果您尝试访问已释放的内存,通常会发生以下三种情况之一:
内存已返回给操作系统,您的程序通常会崩溃。如果你问我,这可能是最好的情况 - 你肯定有问题,但你知道。
内存没有被重用,所以你的旧数据还在。您的程序继续运行,就好像没有任何问题一样。在我看来,这是最坏的情况。您的代码似乎可以正常工作,如果 Murphy 对此有发言权,它会继续这样做,直到它到达您的最终用户 - 然后它会严重失败。
内存已被您的程序重用,您的代码将开始处理自己的数据。如果您小心(并且幸运?),您可能会注意到结果不对。如果没有,那好吧……
如果您使用的是 Linux/Unix Valgrind是捕获此类内存管理问题的好工具。还有用于 C 内存分配器的替换库,例如 DUMA这也将使您能够检测到此类问题。
关于c - 如何释放使用 malloc 分配的内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5392094/