基本的な割り当てにはmalloc
/を使用できます。free
の完全な標準準拠を処理するのnew
は少し注意が必要です。次のようなものが必要です:
void*
operator new( size_t n )
{
void* results = malloc( n );
while ( results == NULL ) {
if ( std::get_new_handler() == NULL ) {
throw std::bad_alloc();
}
(*std::get_new_handler())();
results = malloc( n );
}
return results;
}
ただし、多くの場合、このような完全なコンプライアンスは必要ありません。たとえば、の設定をサポートしていないと言う場合はnew_handler
、大幅に簡略化できます。テストに使用するオーバーロードされたバージョンでは、malloc
実際に失敗した場合は中止します(ただしnew
、コードが正しく反応することをテストしたいので、このバージョンには、オンデマンドでの失敗をトリガーするオプションがあります)。
ログに記録する場合は、無限の再帰を回避するように十分に注意してください。operator new
標準ライブラリで使用されないことが保証されている関数はmalloc
、とだけfree
です。もちろん、動的に割り当てる理由は多くないので、やのような関数については心配しませmemcpy
ん
strlen
。実際には、Cライブラリの関数のいずれかを使用してもおそらく安全です(理論printf
的には、の観点から実装できますiostream
)。ただし、再帰から保護しない限り、iostream、ロケール、または標準コンテナは使用できません。
void*
operator new( size_t n )
{
static int recursionCount = 0;
++ recursionCount;
void* results = malloc() ;
// Any additional logic you need...
if ( recursionCount == 1 ) {
logAllocation( results, n );
}
-- recursionCount;
return results;
}
正式には、同じことを行う必要がありますoperator delete
が、実際には、ファイルにログを記録している場合は、またはデストラクタdelete
以外は期待していません。close()