Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
malloc和free是如何在C中实现的?_C_Memory Management - Fatal编程技术网

malloc和free是如何在C中实现的?

malloc和free是如何在C中实现的?,c,memory-management,C,Memory Management,可能重复: 我在某个地方读到,使用同一指针参数调用free两次会导致未定义的行为。那么free如何知道它需要释放多少内存呢?当我们调用malloc/calloc/realloc时,堆是否总是分配连续内存?请提供相关文章/帖子/博客等的链接。如何定义malloc和free工作。通常,有关内存块的信息将存储在ptr正下方的标题中。但不一定 malloc和free的好处在于,你不需要知道它们是如何工作的。系统会为您处理详细信息 我在某个地方读到,使用同一指针参数调用free两次会导致未定义的行为。为

可能重复:


我在某个地方读到,使用同一指针参数调用free两次会导致未定义的行为。那么free如何知道它需要释放多少内存呢?当我们调用malloc/calloc/realloc时,堆是否总是分配连续内存?请提供相关文章/帖子/博客等的链接。

如何定义
malloc
free
工作。通常,有关内存块的信息将存储在
ptr
正下方的标题中。但不一定

malloc
free
的好处在于,你不需要知道它们是如何工作的。系统会为您处理详细信息

我在某个地方读到,使用同一指针参数调用free两次会导致未定义的行为。为了理解这一点,我必须首先知道自由是如何运作的

我不确定我是否同意这种说法。你只需要遵循规则

当我们调用malloc/calloc/realloc时,堆是否总是分配连续内存


如果您的意思是返回的内存块在地址空间中是连续的,那么是的。如果您的意思是连续分配是连续的,那么否。

实现如何定义
malloc
free
工作。通常,有关内存块的信息将存储在
ptr
正下方的标题中。但不一定

malloc
free
的好处在于,你不需要知道它们是如何工作的。系统会为您处理详细信息

我在某个地方读到,使用同一指针参数调用free两次会导致未定义的行为。为了理解这一点,我必须首先知道自由是如何运作的

我不确定我是否同意这种说法。你只需要遵循规则

当我们调用malloc/calloc/realloc时,堆是否总是分配连续内存


如果您的意思是返回的内存块在地址空间中是连续的,那么是的。如果您的意思是连续分配是连续的,那么就没有了。

如果您想看到一个实现,请查找glibc,它是C标准库的GNU实现,其中包括内存管理功能。但是请注意,在其他平台上实现的具体细节将有所不同,并且可能会在标准库的不同版本之间发生变化。

如果您想查看实现,请查找glibc,它是C标准库的GNU实现,其中包括内存管理功能。但是请注意,在其他平台上实现的具体细节将有所不同,并且可能会在标准库的不同版本之间发生变化。

您可以在tcmalloc页面上阅读有关示例实现的信息。它相对较短且直截了当:(跳到概览)


如果您想知道malloc是如何从操作系统请求内存的,通常可以调用
sbrk
mmap
。当然,这是定义的实现。

您可以在tcmalloc页面上阅读有关示例实现的信息。它相对较短且直截了当:(跳到概览)


如果您想知道malloc是如何从操作系统请求内存的,通常可以调用
sbrk
mmap
。但这当然是实现定义的。

你不需要知道free的工作原理就可以理解这一点。只要您记得在对指针调用free之后,您就不再拥有该位置的内存。尝试访问它会受到惩罚。@WTP:我只是好奇它在引擎盖下是如何工作的。也许你应该改变你的问题,说你想知道malloc/free是如何实现的。“为了理解这一点,我必须首先知道自由是如何工作的”这句话是误导性的。这并不完全是一个dup,所以我不打算投票结束,但在此之前的回答很可能回答了你的很多问题:你不需要真的知道自由是如何工作的才能理解这一点。只要您记得在对指针调用free之后,您就不再拥有该位置的内存。尝试访问它会受到惩罚。@WTP:我只是好奇它在引擎盖下是如何工作的。也许你应该改变你的问题,说你想知道malloc/free是如何实现的。“为了理解这一点,我必须首先知道自由是如何运作的”这句话是误导性的。这并不完全是一个dup,所以我不打算投票结束,但在此之前的回答可能回答了你的许多问题:谢谢你的回答。你能告诉我在哪里可以找到gcc(或其他一些著名的编译器)是如何实现免费的吗?至少为一个编译器学习这一点会很好。编译器并不是免费实现的。libc有。@Bruce您可以在这里了解一个内存分配器:@Bruce,仅供参考,虽然从
malloc
返回的内存在您的地址空间中是连续的,但它在物理上可能不是连续的,但这是一个您通常不需要关心的操作系统问题。“malloc和free的好处在于,你不需要知道它们是如何工作的。”哦,有争议的!谢谢你的回答。你能告诉我在哪里可以找到如何使用gcc(或其他一些著名的编译器)吗免费实现?最好至少为一个编译器学习这一点。编译器没有免费实现。libc有。@Bruce您可以在这里阅读关于一个内存分配器的信息:@Bruce,仅供参考,虽然从
malloc
返回的内存在您的地址空间中是连续的,但它可能在物理上不是连续的,但这是一个操作系统你通常不需要关心的stem问题。“malloc和free的伟大之处在于你不需要知道它们是如何工作的。”哦,有争议!