大規模なアプリケーション (数百万の LOC と数万のファイル) があり、メモリ リークを検出するために debug crt を使用しようとしています。私は次のように new をマクロ化しようとしています:
#define _CRTDBG_MAP_ALLOC
#include <crtdbg.h>
#ifndef NEW_DEBUG
#define NEW_DEBUG new(_NORMAL_BLOCK, __FILE__, __LINE__)
#define new NEW_DEBUG
#endif
現在、私のアプリは非常に大きいので、理想的には、それをヘッダー ファイルに入れ、具体的には何万もの CPP ファイルに含めます。楽しい仕事ではありません。そのため、これを SDK の共通ヘッダー ファイルに配置しようとしました。これは、すべての翻訳単位に含まれます。
私が直面している問題は、一部の STL ヘッダー ファイルと衝突しているように見え、配置 new を使用するとコンパイラがエラーを出力することです。プラグマを使用して新しいマクロを無効にすることで、自分のコードでそれを変更できます。そこは問題ありません。プレースメント new を使用するのは STL ヘッダー ファイルです。変更できません。
cpp ファイルのインクルード ディレクティブを再配置することで、回避策を見つけました。例えば:
// doesn't compile
#include "new_redirect.h"
#include <map> // for instance
// does compile
#include <map> // for instance
#include "new_redirect.h"
しかし、これは困難な回避策です。繰り返しますが、何千ものファイルを変更し、それらの STL ヘッダーが何よりも先に含まれていることを確認する必要があるためです。皮肉なことに、私はこの問題を具体的にテストするために hello world アプリケーションを作成しました。そして、私の hello-world アプリケーションは正常にコンパイルされました。しかし、この回避策がなければ、私の大規模なアプリはそうではありません。
だから私の質問は:
- 大量のコードを動かさずに新しいものを完全にマクロ化できた人はいますか? (比較的痛みのない方法で)
- STL ヘッダー インクルード ディレクティブの再配置を回避する他の方法はありますか?
ありがとう