我们在面对一个大项目时,会常常因为各种内存问题导致很多麻烦事情,调试内存的分配与释放是很常见的事情,其中比较常见的一个办法是用自己的内存管理函数来替换C语言库函数的内存管理函数。由于内存函数是自己的,你可以自己记录内存的分配和使用情况,很多事情都能做。
对于比较小的项目来说,直接把malloc和free等函数用自己的版本去替换,然后在自己的版本中在去调用系统的malloc和free函数,这样就可以完场各种记录和统计。但对于malloc和free使用比较多的项目,这样去替换就比较麻烦了,那我们怎么做呢?其实考察上面的替换过程,其实我们可以想出更好的办法,那就是直接用宏定义去替换,而不是一个一个真正去替换,把替换过程留给预处理器,下面是实现这个办法的同样做法。
首先定义一个头文件myMalloc.h,内容如下:
#ifndef __MY_MALLOC_H__
#define __MY_MALLOC_H__
#ifndef USE_MY_MALLOC
#define malloc myMalloc
#define free myFree
#endif //USE_MY_MALLOC
#endif //__MY_MALLOC_H__
然后定义一个源文件myMalloc.c
#include #include #define USE_MY_MALLOC #include 'myMalloc.h' void *myMalloc(int size) { printf('will be malloc %d\n', size); return malloc(size); } void myFree(void *p) { printf('will be free.\n'); if (p) return free(p); } 注意这里的必须定义USE_MY_MALLOC这个宏,这是因为,我们不能把这里的malloc和free替换,毕竟我们最终还是的用系统的内存分配函数。 OK,有了上面两个文件,把他们加入编译,再把这个myMalloc.h头文件包含到需要替换的所有源文件中。对于复杂项目,由于文件比较多,可以把它放到其它通用头文件里面,这样就不用修改太多就几乎在所有源文件中都有了。做一个真正的项目遇到的事情,远不止这么一点,在此只是举个简单的例子,算是抛砖引玉,让大家对项目有所了解。
联系客服