AutoFreeAlloc受到了广泛的关注,很多读者反应这对他们很有启发。昨天有读者反馈了 STD_NEW 与 MFC 不能共存的问题,我在这里想谈一下这个问题。
原因
MFC 在源代码文件中生成了如下调试代码:
#ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif
请注意,这里定义了一个名为 new 的宏。这导致MFC程序中不能使用所有非标准形式的 new 操作(也就是除了 new Type 和 new Type[n] 形式之外的 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);
话外
我个人的推荐是,不只是在要使用 STD_NEW 时候这样做,而是,所有代码中都使用 DEBUG_NEW,而不是直接使用new。这是一个好习惯,并且不会有什么不良的后果(因为在 Release 版本 DEBUG_NEW 等同于 new,并不会有任何额外的开销)。
另外,其实,如果你坚持用 GC Allocator 的话,其实你的代码里面应该没有 new/delete。我们引入 GC Allocator 的目标就是要让 new/delete 成为 C++ 的过去时。





