2012-11-29 50 views
1

嗨,這有點複雜,所以請讓我知道,如果任何這沒有意義,我們的團隊正在編寫一個C++應用程序,我們以前有運營商新重載。最近我碰到這篇文章:http://www.flipcode.com/archives/How_To_Find_Memory_Leaks.shtml關於如何獲得我們的內存分配調試信息。C++重載運算符new刪除,

應用的#include一個文件,我們有編譯時平臺配置中的所有文件,而該文件中添加以下:

#ifdef _DEBUG 
void* operator new(size_t size, const char *filename, const char *funcname, int line); 
void* operator new[](size_t size, const char *filename, const char *funcname, int line); 
#define new new(__FILE__, __FUNCSIG__, __LINE__) 
#endif 

由於我們只鏈接LIBCMT.LIB我們的平臺編譯,使用STL我刪除我們的舊運營商實施新的看起來像:

// in a .cpp file: 
void* 
operator new(size_t size) { ... } 

,取而代之的是:

// in the same .cpp file as above... 
#undef new 
void* operator new(size_t size, const char *filename, const char *funcname, int line) { ... } 
#define new new(__FILE__, __FUNCSIG__, __LINE__) 

這工作正常編制,但我得到了一堆鏈接錯誤從LIBCMT.LIB:

例如:LIBCMT.LIB(malloc.obj):錯誤LNK2001:解析外部符號__imp_HeapAlloc

添加運算符new的舊實現(不帶附加參數)可以讓鏈接器成功鏈接所有內容。

我的問題:我想libcmt看到我的宏(#定義新新(FILEFUNCSIGLINE)),因此當它連接嘗試和鏈接我定義的版本(與調試宏)。

我如何得到這個工作? (我也嘗試使用visual studio中的屬性表來定義宏)

+2

我認爲這個庫不會鏈接,因爲它沒有用你的重載'new'運算符編譯。只需在自己的代碼中定義一個重載的'new'就不會神奇地使它出現在預建庫中。 – dreamlax

+3

正如@ dreamlax所說,這是行不通的。這是微軟在MFC中的黑客攻擊,應該被拿出來拍攝。如果在定義宏之後使用該關鍵字,則編寫名稱爲關鍵字的宏會產生未定義的行爲。 –

+2

@PeteBecker我寧願用一種很好的老式聖經來抨擊自己。 – WhozCraig

回答

4

你不能讓它工作。如果在包含標準頭的任何文件中定義了此宏,則行爲是未定義的。當然,項目的正常演變將導致人們定義本地的課程operator new,或者使用新的安排,或者這個宏將破壞的許多技術中的任何一種。它與#define while if差不多。即使不使用標準庫,在宏中重新定義關鍵字也是一個可以避免的麻煩。

+0

相關知識,謝謝! – Short