c - 如何释放使用 malloc 分配的内存?

标签 c memory memory-management malloc

 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/

相关文章:

c - 瓦尔格林 |大小为 8 的无效读取 |地址 0x7a41270 在大小为 4 的 block 内是 0 个字节,已分配

ios - 第二次分配属性时是否立即释放对象?

linux - 在没有安装任何东西的情况下运行 Ubuntu 使用 512MB 中的 500 我应该杀死哪个进程?

c++ - 我的应用程序(用 C 语言编写)每次调用时都会出现 gsoap 段错误

c - 未加载 gdb 完整文件

java - 关于Java应用程序的内存使用

asp.net - Environment.WorkingSet 错误地报告内存使用情况

ios - 导航回父场景时解除 segue 问题

c - 在 C 中将字符串分配给 char 时会发生什么

c - 删除数组复制步骤时合并排序问题