事由
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。