我正在我的应用程序中实现一个内存跟踪器,以便更进一步,如果我有任何内存泄漏,我可以切换这个小家伙找到它。
一切都很好,除了我从未传递文件名或行号。是否需要使用_CrtSetDbgFlag
或预处理器命令设置一些标志?
在我运行这个东西(裸骨)后,它显示了26个未清理的分配,我很确定它们不是我,但不知道它们发生在哪里。
提前致谢!
答案 0 :(得分:3)
来自<crtdbg.h>
标题文件:
#ifdef _CRTDBG_MAP_ALLOC
#define malloc(s) _malloc_dbg(s, _NORMAL_BLOCK, __FILE__, __LINE__)
// etc...
#endif
请注意重新定义现在如何调用另一个版本的malloc,其中包含您要查找的文件和行号。显然,要完成这项工作,您必须#define _CRTDBG_MAP_ALLOC和#include crtdb.h。这最好在预编译的头文件中完成,这样您就可以合理地确保所有代码都将使用这些宏生成。
这仍然不能保证你会收到这些信息。您的项目可能正在使用在没有它的情况下编译的.lib。另一种失败模式是在生成泄漏报告之前可能只是卸载的DLL。该DLL的文件和行信息也将被卸载。
诊断那些麻烦制造者有一个后退。泄漏报告有一个以块号开头的泄漏线,显示在花括号内的开始处。只要该块号在运行之间保持稳定,就可以强制调试器在分配时中断。将此代码放在main方法或代码中早期执行的任何位置:
_crtBreakAlloc = 42; // Change the number