【发布时间】:2012-10-27 21:03:54
【问题描述】:
static char THIS_FILE[] = __FILE__; 的意义何在?
简介:它有什么作用?它来自哪里?
MFC 是 Microsoft 的 Windows 原生类库,有一个 DEBUG_NEW 宏,用于跟踪内存分配及其发生的位置(在用户代码中)。
为此,VS 向导将以下代码块放入每个 cpp 文件中:(not 在头文件中)
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
调试新宏定义为(afx.h):
#define DEBUG_NEW new(THIS_FILE, __LINE__)
整个机器将产生有意义的泄漏检测输出,例如:
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.
那么,又是什么问题呢?
让我感到困惑的是THIS_FILE char 数组的用途。机器没有意义。如果他们将DEBUG_NEW定义为:
#define DEBUG_NEW new(__FILE__, __LINE__)
他们可以将它放在一个标题中并完成它,而不是在每个文件中都有 ifdef 块。
那么,THIS_FILE 的意义何在?
(顺便说一句,这正是 MS 的 CRT 对 malloc 和 _malloc_dbg 所做的,其中调试宏在标头 crtdbg.h 中定义为:
#define malloc(s) _malloc_dbg(s, _NORMAL_BLOCK, __FILE__, __LINE__)
)
那么,为什么它在 MFC DEBUG_NEWmacro 中以复杂的方式完成,而简单的方式可以工作(更好)???
更新:哈!我最近注意到 VS2005 向导没有将THIS_FILE 的定义放入生成的 cpp 文件中。
调查了一下,似乎MS前段时间决定不再需要它了,如afxtempl.h定义如下:
#undef THIS_FILE
#define THIS_FILE __FILE__
不过,我想这个问题一直是一样的,为什么它是必要的。 (而且我猜当时内存要求的答案是非常有效的。)
【问题讨论】:
标签: visual-c++ memory-leaks mfc visual-studio-debugging memory-leak-detector