如何更改malloc.c标头内容?

时间:2017-01-31 05:07:01

标签: c++ c linux memory malloc

在用户数据区开始之前,使用malloc分配的内存块中有一些标题内容。

buffer = (char*) (malloc (i));
int j;  
for(j=1;j<9;j++){
printf("before data: %d\n",*(buffer-j));

输出我得到的是 在数据之前:0 在数据之前:0 在数据之前:0 数据之前:35 在数据之前:0 在数据之前:0 在数据之前:0 在数据之前:0

我想在标题中有一个额外的字段,我将用它来设置一些值。我尝试修改malloc.c库以设置自定义标头但没有任何效果。我想知道我是否有办法做到这一点。

3 个答案:

答案 0 :(得分:1)

当您尝试访问未分配的内存时,您的代码包含未定义的行为。在给定的平台上,内存分配器可能会在分配的内存之前放置标头,但你不能依赖它。

创建自己的内存解除分配例程,以便在之前添加更多空间,如:

void *my_malloc(size_t s) 
   char *p = malloc(s+what_you_need);
   if (p!=NULL) return (void *)(p+what_you_need);
   return (void *)p;
}

void my_free(void *p) {
    free(((char *)p)-what_you_need);
}

您也可以继续关注对齐要求。

答案 1 :(得分:1)

如果要替换malloc,可以这样做。看看它是如何在tcmalloc和jemalloc中完成的,并在你自己的代码中完成。

答案 2 :(得分:1)

  

在用户数据区开始之前,使用malloc分配的内存块中有一些标题内容。

这是错误的,或者一般来说可能是错误的。

聪明的malloc实现通常处理各种大小的不同块。有时,malloc实现之前的malloc区域之前的字节不会被使用。

实现malloc的一种可能方法可能是保留几个不同的大块(例如,通过mmap(2) - 大小为兆字节的段)并处理不同的小分配和更大的分配,并比较地址(针对这些部分的边界)来计算尺寸。

特别是,一些malloc实现正在专门处理两个单词单元的分配。他们可以(在他们的free实现中)确定区域的大小,例如通过比较地址。例如,malloc可能用(简单)假设编码,其中y是任意十六进制数字的形式0x10yyyyyy的所有地址都是字对的堆分配。当然,细节在现实生活中要复杂得多,但你明白了:计算堆分配区域的大小不必使用一些前缀数据,可以通过其他方式完成。

并且有几个malloc实现会处理两个单词大小的单元格malloc(通常用于链接列表,或用于Lisp&#34; cons&#34;单元格)尤其。