C++ malloc()用来跟踪分配大小的空间

C++ malloc()用来跟踪分配大小的空间,c++,C++,malloc()函数将在返回点之前的8字节(64位系统)中放置一些关于缓冲区大小的信息。但是有一些不同,这比我预期的要大 char *p = (char*)malloc(0x12345678); 显示数字0x12346002之前的8个字节 (gdb) x/32ubx p-8 0x7fffe56cf008: 0x02 0x60 0x34 0x12 0x00 0x00 0x00 0x00 0x7fffe56cf010: 0x68 0x65 0x

malloc()
函数将在返回点之前的8字节(64位系统)中放置一些关于缓冲区大小的信息。但是有一些不同,这比我预期的要大

char *p = (char*)malloc(0x12345678);
显示数字0x12346002之前的8个字节

(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
不知道为什么会有这么大的差异

malloc()
函数将在返回点之前的8字节(64位系统)中放置一些关于缓冲区大小的信息

虽然这是实现内存管理例程的一种非常常见的方法,但它不是通用的;例如,库可以保留一个单独的哈希表来跟踪分配大小。该标准允许库选择其首选的实现方法

显示数字0x12346002之前的8个字节

(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
假设在分配的地址之前插入8个字节不是未定义的行为(实际上是)。为了优化潜在的
realloc
s,库可以根据需要对数字进行四舍五入。在这种情况下,库决定分配2442个额外字节,以防您稍后决定
realloc

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


虽然在绝对数字中,2442是一个很大的数目,但相对于分配的总大小而言,它是一个很小的数目。

使用链表存储正在使用的和未使用的内容尝试打印
((long*)p)[-1]
。但是请记住,这并不能保证任何一个。与你的断言相反,C++没有真正指定<代码> MaloC/<代码>在它的返回值之前的内存中。它甚至不只是因为<代码> ReLoC/当您稍后再次释放一些页面时,这也是对碎片的巨大胜利。希望有一种方法可以指示malloc()不要分配额外空间。@codingFun不,您没有。但是如果你能保证将所有这些块放在一起,你就可以从
malloc
@o11c获得的一个大块中编写一个池分配器。谢谢。@codingFun从你的经验来看,我非常怀疑你是否真的想重新发明轮子。