c - 分配的内存块的簿记是多余的吗?

标签 c memory-management malloc free

当我们使用 malloc() 时,我们提供了一个以字节为单位的大小。 当我们使用 free() 时,我们什么都不提供。 这是因为操作系统当然已经知道它了,它一定已经将信息存储在某处。

顺便说一下,我们的软件还必须记住它请求了多少内存块,这样我们就可以(例如)安全地从指针开始迭代并继续前进。

所以,我的问题是:这不是多余的吗?既然操作系统知道给定指针所指向的内存大小,我们就不能简单地询问操作系统吗?如果不是,为什么不呢?

最佳答案

When we use malloc() we provide a size in byte. When we use free() we provide nothing. This is because the OS of course knows about it already, it must have stored the information somewhere.

即使它为您提供内存并跟踪属于您的进程的内存范围,操作系统也不关心内存的内部细节。 malloc将分配的 block 的大小存储在它自己的位置,也在你的进程中保留(通常,它是 malloc 返回的逻辑地址之前的几个字节)。 free只需读取保留的信息并自动解除分配。

By the way, also our software must remember how many memory blocks it has requested, so that we can (for instance) safely iterates starting from the pointer and going ahead.

So, my question is: isn't this redundant? Can't we simply ask the OS the size of the memory pointed by a given pointer since it knows it? And if not, why not?

鉴于上述情况,存储该信息是多余的,是的。但是你几乎必须存储它,因为 malloc 的方式它的簿记是一个实现细节。

如果您知道您的特定实现是如何工作的,并且您想为您的软件冒这个风险,那么您可以自由(没有双关语意)去做。如果您不想将您的逻辑建立在实现细节上(并且您不想这样做是对的),您将不得不与 malloc 并排进行这种多余的记账工作。自己记账。

关于c - 分配的内存块的簿记是多余的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25891238/

相关文章:

java - 使用另一个对象的 toString 结果构造一个 new Object()

c# - 为什么这段代码没有调用析构函数

c - 在 malloc 中使用 sizeof(void)

c - 如何在 C 中完成自动数组的排序?

c - 如何以优化方式加载更大的文本文件到缓冲区--c程序

c - 信号量互斥锁防止死锁 - C 程序

c - 使用 malloc 在运行时分配内存时出现段错误

c - 程序错误: unwanted number in statement

python - 使用 Python C API 时检查返回值有多重要?

c - 未知的段错误