2

と の違いについて説明しているこの回答では、from asの違いの 1 つnewmalloc述べています。newmallocCan add a new memory allocator to deal with low memory (set_new_handler)

これの例とそれがどのように機能するか教えてください。

4

3 に答える 3

4

これは正確には新しいメモリ アロケータではありませんが、メモリが不足したときに呼び出されるように登録できる関数ですoperator new

その後、メモリ不足の問題を魔法のように修正できる場合は、 newもう一度試して、うまく機能するかどうかを確認してください。アプリケーションが解放できるメモリを保持していない限り、これはほとんどの場合あまり役に立ちません。

于 2012-08-05T15:00:46.053 に答える
1

新しいハンドラーが役立つ可能性のあるいくつかの例を次に示します。

  1. sysadminが何らかの理由でヒープサイズに低いソフト制限を設定しているUNIXライクなマシンを使用しているとします。新しいハンドラーは、ソフト制限をハード制限に引き上げることができます。新しいメモリが利用できる可能性があります。

  2. アプリケーションにすべてのメモリを占有させたいが、他のすでに実行中のアプリケーションが邪魔をしているとします。したがって、新しいハンドラーを少しだけスリープ状態にします。すでに実行中のプログラムの1つが終了すると、ビオラ!新しいメモリが利用可能です。

オプション#2を採用する商用アプリケーションが少なくとも1つあります。ほとんどの場合、それは間違いです。通常、アプリケーションのユーザーが誤ってどのコンピュータに存在するよりも多くのメモリを割り当てようとしたため、アプリケーションのメモリが不足します。他の実行中のアプリケーションが終了すると、アプリケーションはこれまで以上に多くのメモリを喜んでつぶします。最終的には、オペレーティングシステムを実行する必要があるプログラムを含め、新しいプログラムを開始できなくなります。このアプリケーションは、マシンをひざまずかせるためのかなり優れたツールです。

于 2012-08-05T15:24:57.603 に答える
-1

リンクしている回答でも、「メモリ不足」は実際には「メモリ不足」を示していると思います。set_new_handler で検索してメモリ不足ハンドラーをインストールするサンプル コードの断片がたくさんあります (例: http://www.cplusplus.com/reference/std/new/set_new_handler/ ) 。

私が見た 1 つの実装 (特にメモリを集中的に使用するアプリケーションの製品コード) では、このフックを、アプリケーションの起動時に ~10MB の「雨の日」のブロック割り当てと組み合わせて使用​​していました。このハンドラーがトリガーされると、メモリーが削除され、「制御された終了」パスに入ろうとします。

実際には、これはあまり効果的な手法ではないことがわかりました。メモリ不足になった後の動作はすでに予測不可能であるためです。

于 2012-08-05T15:06:50.487 に答える