嗨,這有點複雜,所以請讓我知道,如果任何這沒有意義,我們的團隊正在編寫一個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看到我的宏(#定義新新(FILE,FUNCSIG,LINE)),因此當它連接嘗試和鏈接我定義的版本(與調試宏)。
我如何得到這個工作? (我也嘗試使用visual studio中的屬性表來定義宏)
我認爲這個庫不會鏈接,因爲它沒有用你的重載'new'運算符編譯。只需在自己的代碼中定義一個重載的'new'就不會神奇地使它出現在預建庫中。 – dreamlax
正如@ dreamlax所說,這是行不通的。這是微軟在MFC中的黑客攻擊,應該被拿出來拍攝。如果在定義宏之後使用該關鍵字,則編寫名稱爲關鍵字的宏會產生未定義的行爲。 –
@PeteBecker我寧願用一種很好的老式聖經來抨擊自己。 – WhozCraig