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值被破坏了.为什么是这样?
您的行为malloc()
和free()
严重依赖于您正在使用的操作系统和C库.在大多数实现中,实际上有两个内存分配器在起作用:
OS内存分配器,它使用处理器的虚拟内存工具为进程提供自己的地址空间,并将物理内存页映射到该地址空间以供使用.
C库内存分配器,实际上是应用程序代码的一部分,它使用操作系统提供的页面来提供细粒度的内存管理工具,由malloc()
和提供free()
.
通常,调用free()
会执行以下一项或多项操作:
它将指向的内存区域标记为C内存分配器中的空闲区域.这允许重用该内存.free()
没有将释放的内存清零.
它可能会将内存返回给操作系统,具体取决于C内存分配器的设置以及是否实际可以释放堆的这一部分.如果未将内存返回给操作系统,则可以malloc()
通过同一应用程序将来的调用重用该内存.
如果您尝试访问已释放的内存,通常会发生以下三种情况之一:
内存已返回到操作系统,您的程序通常会崩溃.如果你问我,这可能是最好的情况 - 你有问题,当然,但你知道.
内存未被重用,因此您的旧数据仍然存在.你的程序继续,好像什么都没有错.这是我认为最糟糕的情况.你的代码似乎工作正常,如果墨菲在这方面有发言权,它将继续这样做,直到它到达你的最终用户 - 然后它将失败.
内存已被您的程序重用,您的代码将开始乱搞自己的数据.如果你小心(幸运吗?),你可能会注意到结果是关闭的.如果没有,那么......
如果您使用的是Linux/Unix,Valgrind是一个很好的工具来捕获这样的内存管理问题.还有用于C内存分配器的替换库,例如DUMA,它还允许您检测此类问题.