free和malloc如何在C中工作?

free和malloc如何在C中工作?

我试图找出如果我试图从中间“释放”指针会发生什么,请看下面的代码:

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

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

非常感谢


胡子哥哥
浏览 429回答 3
3回答

守着星空守着你

你可能知道你应该准确地传回你收到的指针。因为free()最初并不知道块的大小,所以它需要辅助信息才能从其地址中识别原始块,然后将其返回到空闲列表。它还将尝试将小的释放块与邻居合并,以产生更有价值的大型空闲块。最终,分配器必须具有关于块的元数据,至少它需要在某处存储长度。我将描述三种方法。一个显而易见的地方是在返回的指针之前存储它。它可以分配比请求大几个字节的块,将大小存储在第一个单词中,然后返回指向第二个单词的指针。另一种方法是使用地址作为关键字来保持至少描述已分配块长度的单独映射。实现可以从地址中获取一些信息,从地图中获取一些信息。4.3BSD内核分配器(我认为,称为“McKusick-Karel分配器”)为小于页面大小的对象进行二次幂分配,并且仅保持每页大小,从而使得给定页面的所有分配单一尺寸。有些类型的第二种,可能是任何类型的第三种类型的分配器都可以实际检测到你已经提升了指针和DTRT,尽管我怀疑是否有任何实现会烧掉运行时这样做。

繁花如伊

大多数(如果不是全部)实现将查找数据量,以便在您操作的实际指针之前释放几个字节。做一个狂野free会导致内存映射损坏。如果你的例子,当你分配10个字节的内存时,系统实际保留,比方说,14。前4个包含你请求的数据量(10)然后返回值malloc是指向第一个字节的指针未分配的数据在14中分配。当你调用free这个指针时,系统会向后查找4个字节,知道它最初分配了14个字节,因此它知道要释放多少。此系统会阻止您将要释放的数据量作为额外参数释放给free自身。当然,其他实现malloc/&nbsp;free可以选择其他方式来实现这一点。但是它们通常不支持与free指定malloc函数返回的指针不同的指针。
打开App,查看更多内容
随时随地看视频慕课网APP