static char THIS_FILE[] = __FILE__;
的意义是什么?
介绍:它是做什么的?它是从哪里来的?
MFC,Microsofts本机类库for Windows,有一个DEBUG_NEW
宏,用于跟踪内存分配和它们发生的位置(在用户代码中)。
为此,VS向导将以下代码块放入每个cpp文件中:(不在头文件中)
#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_NEW
宏中完成复杂的方式,而简单的方法会工作(更好)?
更新:哈!我最近注意到,VS2005向导没有将THIS_FILE
的定义放入生成的cpp文件中。
对此进行调查,似乎是MS在一段时间前就决定不再需要它了,就像在afxtempl.h
中定义的那样:
#undef THIS_FILE
#define THIS_FILE __FILE__
尽管如此,我想问题仍然是一样的,为什么它是必要的。(我想当时内存需求的答案是非常有效的。)
发布于 2012-11-07 20:07:00
调试分配器在堆块中存储指向文件名的指针。只需4个字节,而不是每个分配的块也必须为文件名分配空间。
请注意,这可能导致在DLL分配泄漏块时丢失调试信息,并且在生成泄漏报告时卸载DLL。
只有字符数组THIS_FILE
在translaton单元中始终是相同的。不是__FILE__
,这是字面意思。而且,即使两个文本具有相同的值,也不能保证它们具有相同的地址,这意味着编译器可以为每次使用__FILE__
创建一个不同的文字--并耗尽内存。
发布于 2012-11-07 19:51:21
我相信,而且我可能是错的,这是勾勒出已编译的exe中的内存块。如果要获得异常,这将有所帮助,如果您知道dll/exe加载的地址,则可以跟踪内存添加链查找违规代码。
发布于 2012-11-29 08:59:55
__FILE__
在整个文件中是相同的,而__LINE__
在每一行上都会发生变化。因此,如果文件中有大量调试代码,那么较早的编译器如果没有很好地合并常量,就会有大量不必要的字符串"filename.ext“副本。您可以使用类似-fno-合并常量(对不起,这是gcc CFLAG用于它,不确定VS)来检查差异。大多数编译器现在默认合并常量,因此没有必要使用该定义。
https://stackoverflow.com/questions/13275966
复制相似问题