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

1 c memory malloc memory-management

 struct element {
   unsigned long int  ip;
   int type;
   int rtt;
   struct element * next;
   struct element * edge;
};
Run Code Online (Sandbox Code Playgroud)

我有一个链表.我使用malloc创建新节点.我尝试使用free(ptr to node)释放内存但是当我再次运行遍历函数时,我可以遍历链表并且rtt值是正确的以及下一个和边指针,因为我可以按照链表.只有ip值被破坏了.为什么是这样?

thk*_*ala 7

您的行为malloc()free()严重依赖于您正在使用的操作系统和C库.在大多数实现中,实际上有两个内存分配器在起作用:

  • OS内存分配器,它使用处理器的虚拟内存工具为进程提供自己的地址空间,并将物理内存页映射到该地址空间以供使用.

  • C库内存分配器,实际上是应用程序代码的一部分,它使用操作系统提供的页面来提供细粒度的内存管理工具,由malloc()和提供free().

通常,调用free()会执行以下一项或多项操作:

  • 它将指向的内存区域标记为C内存分配器中的空闲区域.这允许重用该内存.free()没有将释放的内存清零.

  • 可能会将内存返回给操作系统,具体取决于C内存分配器的设置以及是否实际可以释放堆的这一部分.如果未将内存返回给操作系统,则可以malloc()通过同一应用程序将来的调用重用该内存.

如果您尝试访问已释放的内存,通常会发生以下三种情况之一:

  • 内存已返回到操作系统,您的程序通常会崩溃.如果你问我,这可能是最好的情况 - 你有问题,当然,但你知道.

  • 内存未被重用,因此您的旧数据仍然存在.你的程序继续,好像什么都没有错.这是我认为最糟糕的情况.你的代码似乎工作正常,如果墨菲在这方面有发言权,它将继续这样做,直到它到达你的最终用户 - 然后它将失败.

  • 内存已被您的程序重用,您的代码将开始乱搞自己的数据.如果你小心(幸运吗?),你可能会注意到结果是关闭的.如果没有,那么......

如果您使用的是Linux/Unix,Valgrind是一个很好的工具来捕获这样的内存管理问题.还有用于C内存分配器的替换库,例如DUMA,它还允许您检测此类问题.