In C programming, you can pass any kind of pointer you like as an argument to free, how does it know the size of the allocated memory to free? Whenever I pass a pointer to some function, I have to also pass the size (ie an array of 10 elements needs to receive 10 as a parameter to know the size of the array), but I do not have to pass the size to the free function. Why not, and can I use this same technique in my own functions to save me from needing to cart around the extra variable of the array's length?
当前回答
最初的技术是分配一个稍大的块,并在开始时存储大小,然后将博客的其余部分交给应用程序。额外的空间用于保存大小和可能的链接,以便将空闲块连接在一起以便重用。
然而,这些技巧也存在一些问题,比如糟糕的缓存和内存管理行为。在块中使用内存会导致不必要的分页,还会创建脏页,使共享和写时复制变得复杂。
因此,一个更高级的技术是保持一个单独的目录。还开发了一些奇异的方法,其中内存区域使用相同的2次方大小。
一般来说,答案是:分配一个单独的数据结构来保持状态。
其他回答
来自comp.lang.c常见问题列表:free如何知道释放多少字节?
malloc/free实现在分配每个块时记住它的大小,因此在释放时不需要提醒它大小。(通常,大小存储在已分配块的相邻位置,这就是为什么如果已分配块的边界稍有超出,情况通常会很糟糕)
Malloc()和free()依赖于系统/编译器,所以很难给出一个具体的答案。
更多关于这个问题的信息。
当您调用malloc时,堆管理器将属于已分配块的内存量存储在某处。
我从来没有实现一个自己,但我猜在前面的内存分配块可能包含元信息。
在调用malloc()时,指定要分配的内存量。实际使用的内存量略大于此值,并包括额外的信息,记录(至少)块的大小。你不能(可靠地)访问其他信息-你也不应该:-)。
当调用free()时,它只是查看额外的信息,以确定块有多大。
与此相关的是,GLib库具有不保存隐式大小的内存分配函数——然后您只需将size参数传递给free即可。这可以减少部分开销。
推荐文章
- 为什么函数指针定义可以使用任意数量的&号或星号* ?
- 什么是可重入函数?
- 如何在C中将数组初始化为0 ?
- Typedef定长数组
- 在C语言中通过引用传递
- sizeof(某个指针)总是等于4吗?
- 为什么星号在变量名之前,而不是在类型之后?
- 何时使用内联函数,何时不使用它?
- 在C语言中如何比较结构是否相等?
- 在套接字编程中AF_INET和PF_INET的区别是什么?
- #在C中定义打印调试宏?
- 我应该使用static_cast或reinterpret_cast时,铸造一个void*到什么
- read()和recv(), send()和write()之间有什么区别?
- 为什么0 < -0x80000000?
- 静态const vs #define