sha*_*oth 3 memory debugging memory-management visual-c++
Visual C++调试运行时库具有所谓的分配挂钩.以这种方式工作:您定义一个回调并调用_CrtSetAllocHook()以设置该回调.现在,每次完成内存分配/释放/重新分配时,CRT会调用该回调并传递一些参数.
我成功地使用了一个分配钩子来找到一个可重现的内存泄漏 - 基本上CRT报告在程序终止时有一个分配编号为N(在每个程序运行时N都相同)的不一致块,所以我在我的钩子中编写了以下内容:
int MyAllocHook( int allocType, void* userData, size_t size, int blockType,
long requestNumber, const unsigned char* filename, int lineNumber)
{
if( requestNumber == TheNumberReported ) {
Sleep( 0 );// a line to put breakpoint on
}
return TRUE;
}
Run Code Online (Sandbox Code Playgroud)
因为每次我只能在if语句中放入一个断点并等待它被击中然后检查调用堆栈,就会报告泄漏的分配编号非常相同.
使用分配挂钩可以做些什么其他有用的事情?
您还可以使用它来查找不可重现的内存泄漏: