C++ 是"#定义新调试“U new”;及#取消定义此“U文件”;等等,真的有必要吗?

C++ 是"#定义新调试“U new”;及#取消定义此“U文件”;等等,真的有必要吗?,c++,mfc,c-preprocessor,C++,Mfc,C Preprocessor,创建新的MFC应用程序时,向导会在几乎每个CPP文件中创建以下代码块: #ifdef _DEBUG #define new DEBUG_NEW #endif 有时,它还添加了以下内容: #undef THIS_FILE static char THIS_FILE[] = __FILE__; 如果这个代码是多余的,我想从我的CPP文件中删除它。我正在VS2008上使用带有C++/CLI的MFC应用程序 在从CPP中删除此代码后,我尝试在调试中运行,它似乎工作正常。“new”ing变量工作正常,

创建新的MFC应用程序时,向导会在几乎每个CPP文件中创建以下代码块:

#ifdef _DEBUG
#define new DEBUG_NEW
#endif
有时,它还添加了以下内容:

#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
如果这个代码是多余的,我想从我的CPP文件中删除它。我正在VS2008上使用带有C++/CLI的MFC应用程序

在从CPP中删除此代码后,我尝试在调试中运行,它似乎工作正常。“new”ing变量工作正常,没有泄漏,断言对话框显示正确的文件名并跳转到有问题的行


有人能告诉我它是做什么的,删除它是否安全吗?

删除它是完全安全的。它是一种调试辅助工具;保留它将在输出窗口中的警告中生成程序退出时内存泄漏的更好细节。如果你删除它,你仍然会得到内存泄漏报告,但没有任何关于你的源代码中的位置的详细信息。在微软Visual C++ 2010中,我可以删除整个代码,只在一个标题中只定义一个新的Debug,我仍然有正确的内存泄漏报告,例如

Detected memory leaks!
Dumping objects ->
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {7508} normal block at 0x029B9598, 54 bytes long.
 Data: <                > E4 B8 C9 00 12 00 00 00 12 00 00 00 01 00 00 00 
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {7501} normal block at 0x029B94A8, 28 bytes long.
 Data: <                > E4 B8 C9 00 05 00 00 00 05 00 00 00 01 00 00 00 
f:\source\agent\agent\deviceid.cpp(21) : {7500} normal block at 0x029CDFC0, 8 bytes long.
 Data: <        > A8 95 9B 02 B8 94 9B 02 
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {6786} normal block at 0x029C0D88, 160 bytes long.
 Data: <        G       > E4 B8 C9 00 19 00 00 00 47 00 00 00 01 00 00 00 
f:\source\agent\sysinfo\sysinfo.cpp(27) : {6733} normal block at 0x029B84D8, 92 bytes long.
 Data: <                > 00 00 00 00 00 10 00 00 00 00 01 00 FF FF FE 7F 
Object dump complete.
检测到内存泄漏!
转储对象->
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156):{7508}0x029B9598处的正常块,54字节长。
数据:<>E4 B8 C9 00 12 00 00 01 00 00 00
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156):{7501}0x029B94A8处的正常块,28字节长。
数据:<>E4 B8 C9 00 05 00 00 01 00 00 00
f:\source\agent\agent\deviceid.cpp(21):{7500}0x029CDFC0处的正常块,8字节长。
数据:<>A8 95 9B 02 B8 94 9B 02
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156):{6786}0x029C0D88处的正常块,160字节长。
数据:E4 B8 C9 00 19 00 00 47 00 00 01 00 00
f:\source\agent\sysinfo\sysinfo.cpp(27):{6733}0x029B84D8处的正常块,92字节长。
数据:<>00 00 00 10 00 00 00 01 00 FF FF FE 7F
对象转储完成。

你确定吗?在我删除代码块后,VS2008仍然显示内存泄漏对象转储。也许VC6或其他东西曾经是这样的…?抱歉,我刚刚意识到你所说的有一个微妙之处-当代码存在时,输出窗口会显示包含内存泄漏的文件名和行,而不仅仅是显示内存泄漏。这就解释了生成代码的第一部分。第二部分呢#取消定义此_文件静态字符此_文件[]=文件;我相信这个文件就是DEBUG_NEW用来获取泄漏报告所用的源文件名的。是的,这听起来不错,但有点奇怪,这个文件代码只出现在一些源文件中,而没有出现在其他源文件中。谢谢你帮我弄明白:)不,你没有得到全部信息。请注意,您显示的代码仅显示了
strcore.cpp
中的泄漏,这表明您泄漏了CString对象(或类似对象)。使用正确的DEBUG_NEW/THIS_文件偏移量,它还会报告代码中执行
NEW