替换malloc的方法

替换malloc和new是为了检查内存泄漏和溢出。虽然有valgrind但是并不好用。

0.封装malloc、重写new

C语言可以封装malloc,但是C++就比较麻烦,重写全局new带来很多问题。看来只能借助与编译器或者操作系统实现了。

1.GCC malloc hooks

http://www.gnu.org/savannah-checkouts/gnu/libc/manual/html_node/Hooks-for-Malloc.html

此方法无法支持多线程,deprecated

2.GCC wrap

ld中有一个选项 –wrap,当查找某个符号时,它优先先解析__wrap_symbol, 解析不到才去解析symbol。

好像对C++的new不起作用。

3.POSIX dlsym

系统的dlsym函数链接
void* malloc(size_t size)
{
    static void* (*real_malloc)(size_t) = NULL;
    if (!real_malloc)
    real_malloc = dlsym(RTLD_NEXT, "malloc");

    void *p = real_malloc(size);
    fprintf(stderr, "malloc(%d) = %p\n", size, p);
    return p;
}

4.Linux LD_PRELOAD

环境变量,mac DYLD_INSERT_LIBRARIES

LD_PRELOAD=mymalloc.so ./exe

你可能感兴趣的:(替换malloc的方法)