替换malloc和new是为了检查内存泄漏和溢出。虽然有valgrind但是并不好用。
1.封装malloc、重写new
C语言可以用宏替换malloc,例如: #define malloc cf_malloc 或者就在IDE里面手动查找替换一下。
但是C++就比较麻烦,重写全局new带来很多问题。目前我是只重写基类的new和delete。
2.GCC malloc hooks
http://www.gnu.org/savannah-checkouts/gnu/libc/manual/html_node/Hooks-for-Malloc.html
此方法无法支持多线程,deprecated
3.GCC wrap
ld中有一个选项 –wrap,当查找某个符号时,它优先先解析__wrap_symbol, 解析不到才去解析symbol。
好像对C++的new不起作用。
4.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;
}
5.Linux LD_PRELOAD
环境变量,mac DYLD_INSERT_LIBRARIES
LD_PRELOAD=mymalloc.so ./exe