我正在我的应用程序中实现一个内存跟踪器,以便在更进一步的情况下,如果我得到任何内存泄漏,我可以打开这个小家伙来找到它。
一切都很好,只是我从未传递过文件名或行号。我必须使用_CrtSetDbgFlag
或预处理器命令设置一些标志吗?
在我运行这个东西(准系统)之后,它显示了 26 个未清理的分配,我很确定它们不是我,但不知道它们发生在哪里。
提前致谢!
我正在我的应用程序中实现一个内存跟踪器,以便在更进一步的情况下,如果我得到任何内存泄漏,我可以打开这个小家伙来找到它。
一切都很好,只是我从未传递过文件名或行号。我必须使用_CrtSetDbgFlag
或预处理器命令设置一些标志吗?
在我运行这个东西(准系统)之后,它显示了 26 个未清理的分配,我很确定它们不是我,但不知道它们发生在哪里。
提前致谢!
从头<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