拦截分配和释放内存的所有函数(取决于平台,列表可能如下所示:malloc,calloc,realloc,strdup,getcwd,free),除了执行这些函数最初执行的操作外,还可以保存有关调用的信息. ,在动态增长的全局数组中,可能受多线程程序的同步原语保护.
此信息可能包括函数名称,请求的内存量,成功分配的块的地址,允许您确定调用者是什么的堆栈跟踪,等等.在free()中,从数组中删除相应的元素(如果没有,则将错误的指针传递给free,这也是一个很好的早期检测错误).当程序结束时,转储数组的其余元素 - 它们将是泄漏的块.不要忘记分别在main()之前和之后分配和释放资源的全局对象.要正确计算这些资源,您需要在最后一个全局对象被销毁后转储剩余的资源,因此可能需要对编译器运行时进行小规模的修改