我正在开发一个VC++ NT服务,该服务旨在持续运行数月.它密集使用VC++运行时堆.很明显,堆碎片在某些时候会导致它出现故障(认为它是内存不足).
我可以在我的服务上运行哪些测试来估计它容易出现堆碎片的程度?
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语句中放入一个断点并等待它被击中然后检查调用堆栈,就会报告泄漏的分配编号非常相同.
使用分配挂钩可以做些什么其他有用的事情?