除了查找可重现的内存泄漏之外,我可以使用Visual C++ Debug CRT分配挂钩做些什么?

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语句中放入一个断点并等待它被击中然后检查调用堆栈,就会报告泄漏的分配编号非常相同.

使用分配挂钩可以做些什么其他有用的事情?

Pat*_*ick 5

您还可以使用它来查找不可重现的内存泄漏:

  • 创建一个数据结构,将分配的指针映射到其他信息
  • 在分配钩子中,您可以查询当前的调用堆栈(StackWalk函数)并将调用堆栈存储在数据结构中
  • 在解除分配挂钩中,删除该分配的调用堆栈信息
  • 在应用程序结束时,循环遍历数据结构并报告所有调用堆栈.这些是分配内存但未释放的地方.