如何获取使用malloc()分配的内存块的大小?

And*_*asT 11 c c++ malloc memory-management

可能重复:
如何从C中的指针获取数组的大小?
有没有办法以编程方式确定C++数组的大小?如果没有,为什么?

我从C风格函数中获得了指向一大块已分配内存的指针.现在,调试目的非常有趣,以了解此指针指向的已分配内存块有多大.

是否有什么比通过盲目地越过边界而挑起异常更优雅?

提前谢谢,安德烈亚斯

编辑:

我在Windows上使用VC++ 2005,在Linux上使用GCC 4.3

EDIT2:

_msize在VC++ 2005下不幸的是它在调试模式下导致异常....

EDIT3:

好.我尝试过上面描述的方式,但有效.至少在我调试并确保在调用库退出后立即执行时,我会在缓冲区边界上运行.奇迹般有效.

它只是不优雅,绝不可用于生产代码.

Mar*_*ett 23

它不是标准的,但如果你的库有一个msize()能给你大小的功能.

一个常见的解决方案是malloc使用您自己的函数进行包装,记录每个请求以及大小和结果内存范围,在发布版本中您可以切换回"真实" malloc.

  • 您还可以使用GNU平台上提供的`malloc_usable_size()`函数. (5认同)

小智 12

如果您不介意为了调试而使用低级暴力,您可以#define宏来挂接对malloc和free的调用,并使用大小填充前4个字节.

为了调整

void *malloc_hook(size_t size) {
    size += sizeof (size_t);
    void *ptr = malloc(size);
    *(size_t *) ptr = size;
    return ((size_t *) ptr) + 1;
}

void free_hook (void *ptr) {
    ptr = (void *) (((size_t *) ptr) - 1);
    free(ptr);
}

size_t report_size(ptr) {
    return * (((size_t *) ptr) - 1);
}
Run Code Online (Sandbox Code Playgroud)

然后

#define malloc(x) malloc_hook(x)
Run Code Online (Sandbox Code Playgroud)

等等


Gre*_*ill 10

C运行时库不提供此类功能.故意,故意挑衅异常不会告诉你这个块有多大.

通常,在C中解决此问题的方法是维护一个单独的变量,该变量跟踪分配的块的大小.当然,这有时不方便,但通常没有其他方法可以知道.

您的C运行时库可能提供一些堆调试函数,可以查询已分配的块(毕竟,free()需要知道块有多大),但任何此类事物都是不可移植的.


Adr*_*iuk 5

随着gccGNU linker,你可以轻松包装malloc

#include <stdlib.h>
#include <stdio.h>


void* __real_malloc(size_t sz);
void* __wrap_malloc(size_t sz)
{
    void *ptr;

    ptr = __real_malloc(sz);
    fprintf(stderr, "malloc of size %d yields pointer %p\n", sz, ptr);

    /* if you wish to save the pointer and the size to a data structure, 
       then remember to add wrap code for calloc, realloc and free */

    return ptr;
}

int main()
{
    char *x;
    x = malloc(103);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

并编译

gcc a.c -o a -Wall -Werror -Wl,--wrap=malloc
Run Code Online (Sandbox Code Playgroud)

(当然,如果你愿意的话,这也适用于用g ++编译的c ++代码,以及新的运算符(通过它的错位名称).)

实际上,静态/动态加载的库也将使用您的__wrap_malloc.


归档时间:

查看次数:

30426 次

最近记录:

7 年,4 月 前