我试图通过这样做来覆盖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.)
与 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)
修复两个宏替换问题,并使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被扩展,因为它是一个类似函数的宏.
| 归档时间: |
|
| 查看次数: |
9830 次 |
| 最近记录: |