WinxGui Official Blog

WINX的STD_NEW与MFC共存问题

本文已经迁移到 http://cpp.winxgui.com/cn:std-new-conflict-with-mfc, 建议通过该链接了解最新更新的内容。

WINX的 AutoFreeAlloc 受到了广泛的关注,很多读者反应这对他们很有启发。昨天有读者反馈了 STD_NEW 与 MFC 不能共存的问题,我在这里想谈一下这个问题。

原因

MFC 在源代码文件中生成了如下调试代码:

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

这里定义了一个名为 new 的宏。这导致MFC程序中不能使用所有非标准形式的 new 操作符。这是 MFC 本身的一个缺陷。

STD_NEW 中使用了 placement new,这个 new 操作符在C++标准库 <new> 或者 <new.h> 头文件中定义。

解决方案

我推荐的解决方案是,删除MFC在源代码文件中的调试代码中的如下语句:

#define new DEBUG_NEW

不过这带来另一个问题,在该源代码文件中发生的内存泄漏,MFC程序无法检测到了。

要解决这个问题也很简单,如果要用到 new 的地方,直接用 DEBUG_NEW 代替好了。例如:

Type* a = new Type(arg1, arg2);

改为

Type* a = DEBUG_NEW Type(arg1, arg2);

个人推荐

我个人的推荐是,不只是在要使用 WINX 的 STD_NEW 时候这样做,而是,所有代码中都使用DEBUG_NEW,而不是直接使用new。

2 条评论 »

  1. didaken 于 2007-03-08 @ 22:52:12 留言

    感谢你的回复。你的方法的确可以解决问题,但是这样一来又会带来新的问题,如果由于某种异常导致分配器的析构函数没有被执行的话,那么所有通过AutoFreeAlloc分配的内存都没有释放,而且MFC也捕捉不到这些泄漏,无法报告出来。

  2. 许式伟 于 2007-03-09 @ 09:25:54 留言

    你好,我在winx的样例: winxsamp/tutorials/winx/step016-mfc-together/mfc-together中,class CMfcTogetherApp的构造函数改成:
    CMfcTogetherApp::CMfcTogetherApp()
    {
    std::AutoFreeAlloc& alloc = *new std::AutoFreeAlloc;
    alloc.allocate(10);
    }
    结果mfc仍然可以报告alloc.allocate(10)导致的泄漏。只是不能具体定位到行,这与AutoFreeAlloc本身的机理有关。可否说一下你说的“MFC也捕捉不到这些泄漏”具体情况是怎样的?

有话想说

你必须登录以发表评论。