覆盖malloc的问题

10 c c++

我试图通过这样做来覆盖malloc.

#define malloc(X) my_malloc((X))

void* my_malloc(size_t size)
{

    void *p = malloc(size);
    printf ("Allocated = %s, %s, %s, %x\n",__FILE__, __LINE__, __FUNCTION__, p);
    return p;
}
Run Code Online (Sandbox Code Playgroud)

但是,这是无限期地递归调用my_malloc(因为my_malloc中的malloc调用).我想在my_malloc中调用C malloc函数而不是宏实现.你能告诉我怎么做吗?

谢谢.

Dav*_*ble 20

问题解决了:

void* my_malloc(size_t size, const char *file, int line, const char *func)
{

    void *p = malloc(size);
    printf ("Allocated = %s, %i, %s, %p[%li]\n", file, line, func, p, size);
    return p;
}
#define malloc(X) my_malloc( X, __FILE__, __LINE__, __FUNCTION__)
Run Code Online (Sandbox Code Playgroud)


eph*_*ent 13

使用Glibc,存在全局介入自己的功能malloc_hook(3)正确方法malloc.

#include <stdio.h>
#include <malloc.h>

static void *(*old_malloc_hook)(size_t, const void *);

static void *new_malloc_hook(size_t size, const void *caller) {
    void *mem;

    __malloc_hook = old_malloc_hook;
    mem = malloc(size);
    fprintf(stderr, "%p: malloc(%zu) = %p\n", caller, size, mem);
    __malloc_hook = new_malloc_hook;

    return mem;
}

static void init_my_hooks(void) {
    old_malloc_hook = __malloc_hook;
    __malloc_hook = new_malloc_hook;
}

void (*__malloc_initialize_hook)(void) = init_my_hooks;
Run Code Online (Sandbox Code Playgroud)
$ cat >mem.c <<'EOF'
(the code above)
EOF
$ cat >main.c <<'EOF'
#include <stdio.h>
#include <stdlib.h>
int main() {
    char *buf = malloc(50);
    sprintf(buf, "Hello, world!");
    puts(buf);
    free(buf);
    return 0;
}
EOF
$ cc mem.c main.c
$ ./a.out
0x40077e: malloc(50) = 0x22f7010
Hello, world!

(我们可以使用__attribute__((constructor)),但这个技巧不是必需的:Glibc提供__malloc_initialize_hook了另一种方法来加载运行代码main.)


Lir*_*una 6

与 new/delete 不同,标准 C 或 C++ 中没有覆盖 malloc 和 free 的标准方法。

但是,大多数平台允许您用自己的标准库函数替换这些标准库函数,例如在链接时。

如果这不起作用,并且需要可移植性,请首先声明替换函数,然后使用宏将 malloc/free 函数隐藏到替换函数中,例如:

#include <stdlib.h>

void *myMalloc(size_t size) {
    return (malloc)(size);
}

void myFree(void *ptr) {
    (free)(ptr);
}

#define malloc(size) myMalloc(size)
#define free(ptr) myFree(ptr)
Run Code Online (Sandbox Code Playgroud)


caf*_*caf 6

修复两个宏替换问题,并使LINE等工作,因为你希望他们会:

#define malloc(X) my_malloc((X), __FILE__, __LINE__, __FUNCTION__)

void* my_malloc(size_t size, const char *f, int l, const char *u)
{

    void *p = (malloc)(size);
    printf ("Allocated = %s, %d, %s, %x\n", f, l, u, p);
    return p;
}
Run Code Online (Sandbox Code Playgroud)

(那样LINE和朋友将被评估扩展宏的位置 - 否则它们总是相同的).

将名称(malloc)括在parantheses中可以防止宏malloc被扩展,因为它是一个类似函数的宏.