猿问

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

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

我想知道mallocfree工作。

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;}

如果有可能的话,如果答案是深度的话,我会非常感激的。


慕尼黑5688855
浏览 564回答 3
3回答

噜噜哒

如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.

墨色风雨

Malloc/Free的一个实现如下:通过sbrk()(Unix调用)从操作系统获取一个内存块。在该内存块周围创建页眉和页脚,其中包含一些信息,如大小、权限以及下一个和前一个块所在的位置。当调用malloc时,引用一个指向适当大小的块的列表。然后返回这个块,并相应地更新标头和页脚。
随时随地看视频慕课网APP
我要回答