1

こんにちは、これは少し複雑なので、これが意味をなさない場合はお知らせください。私たちのチームは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(FILEFUNCSIGLINE))を表示させたいので、リンクするときに、定義したバージョンを(デバッグマクロで)リンクしてみてください。

これを機能させるにはどうすればよいですか?(また、Visual Studio内のプロパティシートを使用してマクロを定義してみました)

4

1 に答える 1

4

あなたはそれを機能させることができません。このマクロが標準ヘッダーを含むファイルで定義されている場合、動作は未定義です。そしてもちろん、プロジェクトの通常の進化により、人々はローカルクラスを定義しoperator newたり、新しい配置を使用したり、このマクロが壊れる多くの手法のいずれかを使用したりします。とほぼ同じレベル#define while ifです。標準ライブラリを使用していなくても、マクロでキーワードを再定義することは、問題を引き起こす確実な方法です。

于 2012-11-29T21:50:13.937 に答える