と の違いについて説明しているこの回答では、from asの違いの 1 つnew
をmalloc
述べています。new
malloc
Can add a new memory allocator to deal with low memory (set_new_handler)
これの例とそれがどのように機能するか教えてください。
と の違いについて説明しているこの回答では、from asの違いの 1 つnew
をmalloc
述べています。new
malloc
Can add a new memory allocator to deal with low memory (set_new_handler)
これの例とそれがどのように機能するか教えてください。
これは正確には新しいメモリ アロケータではありませんが、メモリが不足したときに呼び出されるように登録できる関数ですoperator new
。
その後、メモリ不足の問題を魔法のように修正できる場合は、 new
もう一度試して、うまく機能するかどうかを確認してください。アプリケーションが解放できるメモリを保持していない限り、これはほとんどの場合あまり役に立ちません。
新しいハンドラーが役立つ可能性のあるいくつかの例を次に示します。
sysadminが何らかの理由でヒープサイズに低いソフト制限を設定しているUNIXライクなマシンを使用しているとします。新しいハンドラーは、ソフト制限をハード制限に引き上げることができます。新しいメモリが利用できる可能性があります。
アプリケーションにすべてのメモリを占有させたいが、他のすでに実行中のアプリケーションが邪魔をしているとします。したがって、新しいハンドラーを少しだけスリープ状態にします。すでに実行中のプログラムの1つが終了すると、ビオラ!新しいメモリが利用可能です。
オプション#2を採用する商用アプリケーションが少なくとも1つあります。ほとんどの場合、それは間違いです。通常、アプリケーションのユーザーが誤ってどのコンピュータに存在するよりも多くのメモリを割り当てようとしたため、アプリケーションのメモリが不足します。他の実行中のアプリケーションが終了すると、アプリケーションはこれまで以上に多くのメモリを喜んでつぶします。最終的には、オペレーティングシステムを実行する必要があるプログラムを含め、新しいプログラムを開始できなくなります。このアプリケーションは、マシンをひざまずかせるためのかなり優れたツールです。
リンクしている回答でも、「メモリ不足」は実際には「メモリ不足」を示していると思います。set_new_handler で検索してメモリ不足ハンドラーをインストールするサンプル コードの断片がたくさんあります (例: http://www.cplusplus.com/reference/std/new/set_new_handler/ ) 。
私が見た 1 つの実装 (特にメモリを集中的に使用するアプリケーションの製品コード) では、このフックを、アプリケーションの起動時に ~10MB の「雨の日」のブロック割り当てと組み合わせて使用していました。このハンドラーがトリガーされると、メモリーが削除され、「制御された終了」パスに入ろうとします。
実際には、これはあまり効果的な手法ではないことがわかりました。メモリ不足になった後の動作はすでに予測不可能であるためです。