Mar*_* Ba 10 mfc memory-leaks visual-c++ visual-studio-debugging memory-leak-detector
static char THIS_FILE[] = __FILE__;?MFC,Microsoft的Windows原生类库,有一个DEBUG_NEW跟踪内存分配的宏和它们发生的位置(在用户代码中).
为此,VS向导将以下代码块放入每个cpp文件中:( 不在头文件中)
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
Run Code Online (Sandbox Code Playgroud)
并且调试新宏定义为(in afx.h):
#define DEBUG_NEW new(THIS_FILE, __LINE__)
Run Code Online (Sandbox Code Playgroud)
整个机器将产生有意义的泄漏检测输出,如:
Detected memory leaks!
Dumping objects ->
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(141) : {615} normal block at 0x04081CE0, 56 bytes long.
Data: <¬9Í] > AC 39 CD 5D 13 00 00 00 13 00 00 00 01 00 00 00
c:\my\dev\path\myfile.cpp(237) : {614} normal block at 0x04087FC0, 4 bytes long.
Data: <ð > F0 1C 08 04
Object dump complete.
Run Code Online (Sandbox Code Playgroud)
令我困惑的是THIS_FILEchar数组的用途.机器没有意义.如果他们定义DEBUG_NEW如下:
#define DEBUG_NEW new(__FILE__, __LINE__)
Run Code Online (Sandbox Code Playgroud)
他们可以将它放在标题中并完成它,而不是ifdef在每个文件中都有该块.
那么,有什么意义THIS_FILE呢?
(顺便说一句,这正是MS'CRT所做的malloc以及_malloc_dbg调试宏在标头中定义的位置crtdbg.h:
#define malloc(s) _malloc_dbg(s, _NORMAL_BLOCK, __FILE__, __LINE__)
Run Code Online (Sandbox Code Playgroud)
)
再说一遍,为什么它在MFC DEBUG_NEW宏中以复杂的方式完成,当简单的方法可行(更好)?
更新:哈!我最近注意到VS2005向导没有将定义THIS_FILE放入生成的cpp文件中.
调查它,似乎MS不久前决定,它不再是必要的,因为在afxtempl.h下面定义:
#undef THIS_FILE
#define THIS_FILE __FILE__
Run Code Online (Sandbox Code Playgroud)
尽管如此,我想问题仍然是一致的,至于为什么它是必要的.(我想当时的内存需求方式的答案是非常有效的.)
调试分配器在堆块中存储指向文件名的指针.只需4个字节,而不是每个已分配的块也必须为文件名分配空间.
请注意,当泄漏的块由DLL分配并且在生成泄漏报告时卸载DLL时,这可能会导致调试信息丢失.
THIS_FILE在translaton单元中,只保证字符数组始终相同.不__FILE__,这是一个文字.并且两个文字不保证具有相同的地址,即使它们具有相同的值,这意味着编译器可以为每次使用创建不同的文字 - 并且用尽内存__FILE__.
| 归档时间: |
|
| 查看次数: |
3168 次 |
| 最近记录: |