动态内存分配c 是否有可能找到分配给指针的内存,而不搜索malloc语句




动态内存分配c++ (3)

假设我已经将内存分配给函数foo某个指针:

void foo()
{    
    // ...  
    int *ptr = malloc(20*sizeof(int));  

    bar (ptr);
}  

foo() ,我把这个指针传给bar() ,让我们从bar()到另一个函数。

现在,在某个时间点,我想要检查:指针分配了多少内存。

有没有可能的方法,没有搜索的声明:

int *ptr = malloc(20*sizeof(int)); 

找出多少内存分配给指针,使用GDB?

谢谢。



一般来说,没有。 C没有提供获取分配的内存块大小的方法。 你需要跟踪你自己分配了多少内存。

但是 ,在一些C库中,有一个函数可以获得一块内存的可用大小malloc_usable_size (可以在Linux系统上的<malloc.h>找到,不需要手册页)。 请注意,这不适用于所有的libcs​​,并可能报告比您要求的值更大的值。 请仅用于调试。

为了完整malloc_usable_size ,我的原始答案,在@Employed俄罗斯指出malloc_usable_size之前,深入低级堆元数据:

但是 ,您可能能够手动提取此。 但是请注意,这一切都可以根据您的操作系统,CPU架构和C库而有所不同。 我会假设你正在使用eglibc 2.12.1; 你的结果可能会在其他地方变化

警告 :严重的是,不要使用这个,除非在gdb中进行调试。 真。 我是认真的。

glibc内存分配器像这样存储大块内存(在malloc / malloc.c中的doc注释之外):

    chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
            |             Size of previous chunk, if allocated            | |
            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
            |             Size of chunk, in bytes                       |M|P|
      mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
            |             User data starts here...                          .
            .                                                               .
            .             (malloc_usable_size() bytes)                      .
            .                                                               |
nextchunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
            |             Size of chunk                                     |
            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

你的数据在这里是'mem',块的大小包括头部。 P标志表示前面块数据是否有效,M表示这是一个mmap映射(对于大型malloc)。 所有这些都不是太重要, 什么是重要的是在你的记忆之前,大小生活在一个指针大小的增量。 你只需要掩盖掉这些标志并减去标题大小:

Breakpoint 1, main () at test.c:8
8               char *a = malloc(32);
(gdb) n
10              free(a);
(gdb) print (*((unsigned long long*)a - 1) & ~3) - sizeof(unsigned long long)*2
$14 = 32

警告:实际分配的大小可能比您要求的大。 不要试图变得聪明,并使用多余的。 问一开始你需要多少钱。

警告2:这只适用于glibc。 它只适用于特定版本的glibc。 因此可能在任何时候没有任何警告地破碎。 我不能强调这一点, 不要在你的实际代码中使用这个; 只有在用尽其他选项时才进行调试。 您的代码需要自行跟踪其缓冲区大小。


没有 。 当你使用malloc()时,你必须自己存储这些信息。





gdb