WINX的STD_NEW与MFC共存问题
2007-03-08 11:20
148 查看
本文已经迁移到:http://cpp.winxgui.com/cn:std-new-conflict-with-mfc
2007-3-8
昨天有读者反馈了 STD_NEW 与 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> 头文件中定义。
#define new DEBUG_NEW
不过这带来另一个问题,在该源代码文件中发生的内存泄漏,MFC程序无法检测到了。
要解决这个问题也很简单,如果要用到 new 的地方,直接用 DEBUG_NEW 代替好了。例如:
Type* a = new Type(arg1, arg2);
改为
Type* a = DEBUG_NEW Type(arg1, arg2);
WINX的STD_NEW与MFC共存问题
许式伟 (版权声明)2007-3-8
事由
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。相关文章推荐
- WINX的STD_NEW与MFC共存问题
- WINX的STD_NEW与MFC共存问题
- WINX的STD_NEW与MFC共存问题
- WINX的STD_NEW与MFC共存问题
- WINX的STD_NEW与MFC共存问题
- 【转载】MFC的DEBUG_NEW与GDI+的冲突问题
- VC++6.0&&VS2008&MFC&API学习问题总结(二)(malloc/new/OnReceive)
- MFC的DEBUG_NEW与GDI+的冲突问题
- Visual Stdio 2008 最大内存分配块大小问题: 使用new 分配连续723M内存 出错 std::bad_alloc at memory location 0x0013e0b8
- MFC中CString与std::string之间的转换问题 涉及LPTSTR
- std::min&std::max与mfc冲突问题
- std::min&std::max与mfc冲突问题
- MFC的DEBUG_NEW与GDI+的冲突问题
- mfc屏幕抖动问题
- loj6226「网络流 24 题」骑士共存问题
- C++关于new动态分配内存的问题
- MFC 控件显示层次调整(叠放次序)和绘制控制问题
- PHP new StdClass() 创建空对象
- 解决“Cannot merge new index 67208 into a non-jumbo instruction”的问题
- VS 2013以上版本 MFC TeeChart m_chart.GetAxis().GetBottom()报错问题