【问题标题】:Are "#define new DEBUG_NEW" and "#undef THIS_FILE" etc. actually necessary?“#define new DEBUG_NEW”和“#undef THIS_FILE”等真的有必要吗?
【发布时间】:2010-10-05 23:43:06
【问题描述】:

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

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

有时它还会添加以下内容:

#undef THIS_FILE
static char THIS_FILE[] = __FILE__;

如果此代码是多余的,我想从我的 CPP 文件中删除它。我在 VS2008 上使用带有 C++/CLI 的 MFC 应用程序。

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

谁能告诉我它的作用以及删除它是否安全?

【问题讨论】:

    标签: c++ mfc c-preprocessor


    【解决方案1】:

    删除它是完全安全的。这是一个调试辅助工具;将其保留将在程序退出时的任何内存泄漏的输出窗口的警告中生成更好的详细信息。如果您删除它,您仍然会收到内存泄漏报告,但只是没有任何有关它们发生在源代码中的位置的详细信息。

    【讨论】:

    • 你确定吗?在我删除代码块后,VS2008 仍然显示内存泄漏对象转储。也许这曾经是 VC6 或其他东西的情况......?
    • 抱歉,我刚刚意识到您所说的有些微妙之处 - 当代码存在时,输出窗口会显示包含内存泄漏的文件名和行,而不是仅仅显示存在内存泄漏。
    • 这样就解释了生成代码的第一部分。第二部分呢? #undef THIS_FILE 静态字符 THIS_FILE[] = FILE;
    • 我相信 THIS_FILE 是 DEBUG_NEW 用来获取它用于泄漏报告的源文件名的文件。
    • 是的,这听起来不错,但 THIS_FILE 代码仅存在于某些源文件中而不存在于其他源文件中,这有点奇怪。谢谢你帮我弄清楚:)
    【解决方案2】:

    在 Microsoft Visual C++ 2010 上,我可以删除整个代码并在标题中只放一个 #define NEW DEBUG_NEW,我仍然得到正确的内存泄漏报告,例如

    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.
    

    【讨论】:

    • 不,您没有获得全部信息。请注意,您显示的代码如何仅显示 strcore.cpp 中的泄漏,这表明您泄漏了 CString 对象(或类似对象)。使用正确的 DEBUG_NEW/THIS_FILE 偏移量,它还会报告 your 代码中您执行 new 的位置
    猜你喜欢
    • 2018-04-05
    • 2021-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 2010-12-20
    相关资源
    最近更新 更多