为了账号安全,请及时绑定邮箱和手机立即绑定

malloc()和free()是如何工作的?

malloc()和free()是如何工作的?

C++
慕尼黑5688855 2019-06-14 10:51:45
malloc()和free()是如何工作的?我想知道malloc和free工作。int main() {     unsigned char *p = (unsigned char*)malloc(4*sizeof(unsigned char));     memset(p,0,4);     strcpy((char*)p,"abcdabcd"); // **deliberately storing 8bytes**     cout << p;     free(p); // Obvious Crash, but I need how it works and why crash.     cout << p;     return 0;}如果有可能的话,如果答案是深度的话,我会非常感激的。
查看完整描述

3 回答

?
噜噜哒

TA贡献1784条经验 获得超7个赞

如aluser所说这个论坛帖子:

您的进程有一个内存区域,从Address x到Address y,称为堆。你所有的数据都住在这个地区。malloc()保存了堆中所有空闲空间块的一些数据结构,比如一个列表。当您调用malloc时,它会在列表中查找一个足够大的块,返回一个指向它的指针,并记录它不再空闲的事实以及它的大小。当您使用相同的指针调用free()时,free()将查找该块的大小并将其添加回空闲块()列表中。如果调用malloc()而它在堆中找不到足够大的块,则使用BRK()SysCall来增长堆,即增加Address y,并使旧y和新y之间的所有地址成为有效内存。BRK()必须是SysCall;没有办法完全从用户空间完成相同的事情。

malloc()依赖于系统/编译器,因此很难给出具体的答案。但是,基本上它确实会跟踪它分配了什么内存,并且取决于它是如何分配的,这样您对空闲的调用就可能失败或成功。

malloc() and free() don't work the same way on every O/S.


查看完整回答
反对 回复 2019-06-14
?
墨色风雨

TA贡献1853条经验 获得超6个赞

Malloc/Free的一个实现如下:

  1. 通过sbrk()(Unix调用)从操作系统获取一个内存块。
  2. 在该内存块周围创建页眉和页脚,其中包含一些信息,如大小、权限以及下一个和前一个块所在的位置。
  3. 当调用malloc时,引用一个指向适当大小的块的列表。
  4. 然后返回这个块,并相应地更新标头和页脚。


查看完整回答
反对 回复 2019-06-14
  • 3 回答
  • 0 关注
  • 563 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信