我们在C语言中使用malloc()动态分配内存,并收到指向堆中位置的指针。现在我们使用free()来释放内存,传递与其参数相同的指针值。
现在的问题是,free()如何知道要释放多少内存... 考虑到我们可以随时调整malloc()分配的内存块的大小。
这里是否与哈希表有关?
现在的问题是,free()如何知道要释放多少内存... 考虑到我们可以随时调整malloc()分配的内存块的大小。
这里是否与哈希表有关?
一个典型的实现将在malloc返回的地址前存储信息。这些信息包括realloc或free需要了解的执行工作的信息,但具体存储的内容取决于实现方式。
在著名的K&R C圣经第186-188页中,最简单的实现方法如下:
我们实际得到的内存块比我们申请的要大(一个结构体头部或联合头部的大小)。该结构可能是这样的:
typedef long Align;
union header
{
struct
{
union header* ptr; // next block
unsigned size; // size of this block , times of head size
}s;
Align x;
};
下面是一个示意图:
当我们调用free
函数时,可能会出现以下行为:
void free(void* ptr)
{
Header *bp, *p;
bp = (Header *)ptr - 1;
/* ..... */
/*return the memory to the linked list */
}
发布版本
和调试版本
,我们甚至可以使用头文件来存储调试信息以便于调试。在调试版本
中的头文件称为_CrtMemBlockHeader
,定义如下:typedef struct _CrtMemBlockHeader
{
struct _CrtMemBlockHeader * pBlockHeaderNext;
struct _CrtMemBlockHeader * pBlockHeaderPrev;
char * szFileName;
int nLine;
size_t nDataSize;
int nBlockUse;
long lRequest;
unsigned char gap[nNoMansLandSize];
} _CrtMemBlockHeader;
int
或 long
类型,通常存储在 pointer-2
或 pointer-4
的位置。具体细节取决于编译器。