什么是`静态字符THIS_FILE [] = __FILE __;`?

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)

尽管如此,我想问题仍然是一致的,至于为什么它是必要的.(我想当时的内存需求方式的答案是非常有效的.)


Han*_*ant 8

调试分配器在堆块中存储指向文件名的指针.只需4个字节,而不是每个已分配的块也必须为文件名分配空间.

请注意,当泄漏的块由DLL分配并且在生成泄漏报告时卸载DLL时,这可能会导致调试信息丢失.

THIS_FILE在translaton单元中,只保证字符数组始终相同.不__FILE__,这是一个文字.并且两个文字不保证具有相同的地址,即使它们具有相同的值,这意味着编译器可以为每次使用创建不同的文字 - 并且用尽内存__FILE__.

  • 只保证THIS_FILE始终相同.不是`__FILE__`,这是一个文字.并且两个文字不保证具有相同的地址,即使它们具有相同的值. (2认同)