malloc()用于跟踪分配大小的空间

时间:2016-04-09 19:14:28

标签: c++

malloc()函数会在返回的点之前在8字节(在64位系统中)放置一些信息,以获取有关缓冲区大小的一些信息。但是有一些差异比我预期的要大。

char *p = (char*)malloc(0x12345678);

它前面的8个字节显示数字0x12346002

(gdb) x/32ubx p-8
0x7fffe56cf008: 0x02    0x60    0x34    0x12    0x00    0x00    0x00    0x00
0x7fffe56cf010: 0x68    0x65    0x6c    0x6c    0x6f    0x20    0x77    0x6f
0x7fffe56cf018: 0x72    0x6c    0x64    0x0a    0x00    0x00    0x00    0x00
0x7fffe56cf020: 0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00

想知道为什么会有这么大的差异

1 个答案:

答案 0 :(得分:4)

  

malloc()函数会在返回的点之前在8字节(在64位系统中)放置一些信息,以获取有关缓冲区大小的一些信息。

虽然这是实现内存管理例程的一种非常常见的方式,但它并不普遍;例如,库可以保留单独的哈希表来跟踪分配大小。该标准允许图书馆选择他们喜欢的实施方法。

  

它前面的8个字节显示数字0x12346002

假装片刻在分配的地址之前戳入8个字节并不是未定义的行为(实际上它是)。允许图书馆根据需要对数字进行舍入,以优化潜在的realloc。在这种情况下,如果您决定稍后realloc,则库决定分配2442个额外字节。

  

想知道为什么会有这么大的差异

虽然绝对数字2442很多,但与分配的整体规模相比,这个数字很小。