gpt4 book ai didi

c - free 和 malloc 在 C 中是如何工作的?

转载 作者:IT王子 更新时间:2023-10-28 23:28:25 24 4
gpt4 key购买 nike

我试图弄清楚如果我尝试“从中间”释放指针会发生什么比如看下面的代码:

char *ptr = (char*)malloc(10*sizeof(char));

for (char i=0 ; i<10 ; ++i)
{
ptr[i] = i+10;
}
++ptr;
++ptr;
++ptr;
++ptr;
free(ptr);

我遇到了一个带有未处理异常错误消息的崩溃。我想了解 free 为什么以及如何工作,这样我不仅知道如何使用它,还能够理解奇怪的错误和异常,并更好地调试我的代码ץ

非常感谢

最佳答案

当你 malloc 一个 block 时,它实际上分配的内存比你要求的多一点。这个额外的内存用于存储信息,例如分配 block 的大小,以及到 block 链中下一个空闲/使用 block 的链接,有时还有一些“保护数据”,可以帮助系统检测你是否写过去您分配的 block 的结尾。此外,大多数分配器会将总大小和/或内存部分的开头四舍五入为字节的倍数(例如,在 64 位系统上,它可能会将数据对齐为 64 位(8 字节)的倍数,如对于处理器/总线而言,从非对齐地址访问数据可能更加困难且效率低下),因此您最终可能还会得到一些“填充”(未使用的字节)。

当您释放指针时,它会使用该地址来查找它添加到已分配 block 的开头(通常)的特殊信息。如果你传入不同的地址,它会访问包含垃圾的内存,因此它的行为是不确定的(但最常见的是会导致崩溃)

稍后,如果您释放() block 但没有“忘记”您的指针,您将来可能会不小心尝试通过该指针访问数据,并且行为未定义。可能会出现以下任何一种情况:

  • 内存可能会被放入空闲 block 列表中,因此当您访问它时,它仍然恰好包含您留在那里的数据,并且您的代码可以正常运行。
  • 内存分配器可能已将(部分)内存分配给程序的另一部分,而这可能会覆盖(部分)您的旧数据,因此当您读取它时,您会得到可能的垃圾导致代码出现意外行为或崩溃。或者,您将覆盖其他数据,导致程序的其他部分在未来某个时候出现异常行为。
  • 内存可能已返回给操作系统(您不再使用的内存“页面”可以从地址空间中删除,因此该地址不再有任何可用内存 - 本质上是未使用的内存)应用程序内存中的“洞”)。当您的应用程序尝试访问数据时,将发生硬内存故障并终止您的进程。

这就是为什么在释放指针指向的内存后确保不使用指针很重要的原因 - 最佳实践是在释放内存后将指针设置为 NULL,因为您可以轻松地测试NULL,并且尝试通过 NULL 指针访问内存将导致错误但一致的行为,这更容易调试。

关于c - free 和 malloc 在 C 中是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1957099/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com