のオーバーライドをバイパスする方法はありますoperator new
か?
このようなもの:
void* ::operator new( std::size_t size ) {
void *p = ( ::operator new( size ) ); // But original, _not_ infinite recursion
// do stuff with p
return p;
}
背景:
私は最近、Visual Studio 2012 でコンパイルするように切り替えたレガシー コードをいくつか持っています。十分なメモリ ブロックにmalloc
失敗すると、ランダムにクラッシュします。_heap_alloc
(はい、コードには小さなメモリ リークやその他の悪い動作が散りばめられています。しかし、残念ながら完全なクリーンアップは現実的ではありません。500 000 SLOC 程度です。)
私の現在の理論では、原因は、ほとんどすべてのソース ファイルに、次のオーバーライドを持つヘッダーが含まれていることですoperator new
。
void* ::operator new( std::size_t size ) {
void* p = malloc( size );
if( p == NULL )
throw;
// set memory to zero
memset( p, 0, size );
return p;
};
void* ::operator new[]( size_t count ) throw(std::bad_alloc) {
// try to allocate count bytes for an array
return (operator new(count));
}
のオーバーライドはありませんdelete
。
本質的に、これは、アプリケーションが の代わりに を使用malloc
した割り当てと解放を使用することを意味します。delete
free
delete
最初に Q&D 修正を試みます:その usesのオーバーライドを導入しますfree
。しかし、これは部分的にしか役に立ちません。順序を含めたり、リンクされたライブラリが混乱したりすることがあるためです。
2 回目の Q&D 修正の試行: オーバーライドを削除します。残念ながらメモリを 0 に初期化する必要があります。常にそれを行っていた古いコンパイラからの遺産、およびC++が常にそれを行うと想定したコーダー。
new() がそれを処理することは承知していますが、残念ながら、手動ですべてのソース コードを調べて更新することなく、それを利用する良い方法を知りません。また、コンストラクターでそれを行わずにすべてのメンバーを無効にすることを想定している、実装が不十分なクラスには役立ちません。
したがって、Q&D 修正の 3 番目のアイデアは、この質問が尋ねるように、オーバーライドで通常の new を使用することです。