こんにちは、これは少し複雑なので、これが意味をなさない場合はお知らせください。私たちのチームはC ++アプリケーションを作成しており、以前は演算子newがオーバーロードされていました。最近、次の記事に出くわしました:http ://www.flipcode.com/archives/How_To_Find_Memory_Leaks.shtmlメモリ割り当てを使用してデバッグ情報を取得する方法について。
アプリケーション内のすべてのファイルには、コンパイル時のプラットフォーム構成がある1つのファイルが含まれ、そのファイル内に次のファイルを追加しました。
#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を使用するために、次のような演算子newの古い実装を削除しました。
// 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に私のマクロ(#define new new(FILE、FUNCSIG、LINE))を表示させたいので、リンクするときに、定義したバージョンを(デバッグマクロで)リンクしてみてください。
これを機能させるにはどうすればよいですか?(また、Visual Studio内のプロパティシートを使用してマクロを定義してみました)