40

アプリにはパフォーマンスとメモリの厳しい制約があるため、コーディング標準ではデフォルト ヒープの使用が禁止されています。つまり、 no malloc、 no default ですnew。すべてのメモリ割り当ては、いくつかの特定のアロケーターの 1 つを選択する必要があります。何かのようなもの

// declared globally
void* operator new( size_t size, CustomAllocHeap* heap, const char* perpetrator_name )
{
  return heap->Allocate( size, perpetrator_name );
} 
// imagine a bunch of CustomAllocHeap's declared globally or statically, thus

Vector* v = new( gPhysicsHeap, __FUNCTION__ ) Vector( 1.0f, 2.0f, 3.0f, 4.0f );
// or in a class
Thingy* p = new( this->LocalArenaHeap, __FUNCTION__ ) Thingy();

私たちのコードではこれについて適切な規律を維持してきましたが、一部の標準 C++ コンポーネント (コンテナーstd::function) は密かに既定のnewヒープを呼び出しますが、これは非常に悪いことです。

なんらかの方法でデフォルトを完全に無効にすることをお勧めしますnew。これにより、暗黙的にデフォルトの割り当てが発生するコード行がすぐにコンパイラ エラーをスローします。そうすれば、これらのことにすぐに気付くことができます。

明らかに実行時エラーをスローすることができますnew

void* operator new ( size_t ) { __debugbreak(); return NULL; }  

ただし、コンパイル時にこれに関する警告を取得する方がはるかに優れています。それは可能ですか?

私たちのアプリは、固定プラットフォーム (Visual Studio を使用した x64) 用に構築されています。携帯性は申し分ありません。

4

4 に答える 4

1

あなた自身の "new" 演算子が "new" ではなく別の名前 (例えば "myNew") である場合、"#define" を使用して "new" をゴミに置き換えることができます:

#define new *+-/&

プリコンパイラは「新しい」を置き換えるようになりました。

x = new mytype;

ごみによって:

x = *+-/& mytype;

リンク時のメッセージと比較した場合の利点は、リンク時の最後ではなく、C++ ファイルのコンパイル中にすぐにコンパイラ メッセージが生成されることです。「new」が配置されている行も表示されます。

欠点は、プロジェクト内のすべての C++ ファイルで、この「#define」を含むファイルを「#include」する必要があることです。

于 2013-08-22T06:58:13.437 に答える
1

毒殺せよ!
GCC を使用している場合は、このためのプラグマがあります。

#ifdef __GNUC__

/* poision memory functions */
#   pragma GCC poison malloc new

#endif
于 2016-06-14T22:44:04.633 に答える