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?


当前回答

回答你问题的后半部分:是的,你可以,在C语言中一个相当常见的模式如下:

typedef struct {
    size_t numElements
    int elements[1]; /* but enough space malloced for numElements at runtime */
} IntArray_t;

#define SIZE 10
IntArray_t* myArray = malloc(sizeof(intArray_t) + SIZE * sizeof(int));
myArray->numElements = SIZE;

其他回答

要回答第二个问题,是的,您可以(某种程度上)使用与malloc()相同的技术 通过简单地将每个数组中的第一个单元格分配给数组的大小。 这样就可以在不发送额外size参数的情况下发送数组。

当您调用malloc时,堆管理器将属于已分配块的内存量存储在某处。

我从来没有实现一个自己,但我猜在前面的内存分配块可能包含元信息。

在调用malloc()时,指定要分配的内存量。实际使用的内存量略大于此值,并包括额外的信息,记录(至少)块的大小。你不能(可靠地)访问其他信息-你也不应该:-)。

当调用free()时,它只是查看额外的信息,以确定块有多大。

回答你问题的后半部分:是的,你可以,在C语言中一个相当常见的模式如下:

typedef struct {
    size_t numElements
    int elements[1]; /* but enough space malloced for numElements at runtime */
} IntArray_t;

#define SIZE 10
IntArray_t* myArray = malloc(sizeof(intArray_t) + SIZE * sizeof(int));
myArray->numElements = SIZE;

free()如何知道释放多少内存?我突然被一个明显重复的问题阻止了回答。这个答案应该与这个副本相关:


对于malloc,堆分配器将原始返回指针的映射存储到稍后释放内存所需的相关细节。这通常涉及以与正在使用的分配器相关的任何形式存储内存区域的大小,例如原始大小,或用于跟踪分配的二叉树中的节点,或正在使用的内存“单元”的计数。

Free不会失败,如果你“重命名”指针,或以任何方式复制它。然而,它是不计算参考,只有第一个自由将是正确的。额外的自由是“双重自由”错误。

试图释放与之前malloc返回值不同且尚未释放的任何指针将会出错。不可能部分释放从malloc返回的内存区域。