_set_new_handler
new の演算子によるメモリ割り当てに失敗すると例外処理機構に移します。
_PNH _set_new_handler(
_PNH pNewHandler
);
パラメーター
- pNewHandler
処理関数ではアプリケーションが指定したメモリへのポインター。0 の引数は新しいハンドラーを削除します。
戻り値
前の関数が後で復元できるように _set_new_handler に登録されている関数を処理する前の例外へのポインターを返します。前の関数が設定されていない場合の既定の動作を復元するには戻り値を使用できます ; この値は NULL です。
解説
C++ _set_new_handler の関数は new の演算子によるメモリ割り当てに失敗すると例外処理を制御する関数を指定します。new に失敗した場合ランタイム システムは自動的に _set_new_handler に引数として渡された例外処理関数を呼び出します。New.h で定義されている _PNH を返すことが int を入力して型の引数を受け取ります size_t 関数へのポインター。割り当てられる空きを指定するために size_t を使用します。
既定のハンドラーはありません。
_set_new_handler は主にガベージ コレクションの設定です。ランタイム システムは割り当てのたびに関数の戻り値以外の値再試行し0 が返されます失敗します。
例外処理の関数がランタイム システムでは引数リストで指定したレジスタのプログラム _set_new_handler 関数の場合 :
#include <new.h>
int handle_program_memory_depletion( size_t )
{
// Your code
}
int main( void )
{
_set_new_handler( handle_program_memory_depletion );
int *pi = new int[BIG_NUMBER];
}
_set_new_handler の関数に渡されたし最後に保存する関数アドレスを後で元 :
_PNH old_handler = _set_new_handler( my_handler );
// Code that requires my_handler
_set_new_handler( old_handler )
// Code that requires old_handler
C++ の関数 _set_new_mode の設定 malloc の new ハンドラー モード。新しいハンドラー モードはエラーが発生した場合malloc が _set_new_handler に設定した新しいハンドラー ルーチンを呼び出すかどうかを示します。既定ではmalloc にメモリを割り当てる失敗の new ハンドラー ルーチンを呼び出していません。同じ理由で失敗すると new の演算子はmalloc がメモリを割り当てるとmalloc が新しいハンドラー ルーチンと同じ方法で呼び出すように既定の動作をオーバーライドできます。既定値をオーバーライドするにはメソッドを実行します :
_set_new_mode(1)
高速 Newmode.obj のプログラムまたはリンクで。
ユーザー定義の operator new を指定した場合は新しいハンドラー関数は自動的に失敗コードではありません。
詳細についてはC++ 言語リファレンスの 新規作成 と 削除 を参照してください。
動的にリンクされる DLL または実行可能ファイルの _set_new_handler 一つのハンドラーがあります。; _set_new_handler を呼び出した場合でもハンドラーは別の置換したり別の DLL または実行可能ファイルとハンドラーを置き換えるに設定されます。
必要条件
ルーチン |
必須ヘッダー |
---|---|
_set_new_handler |
<new.h> |
互換性の詳細については、「C ランタイム ライブラリ」の「互換性」を参照してください。
使用例
この例では割り当てに失敗するとコントロールは MyNewHandler に移動します。MyNewHandler に渡される引数は要求されたバイト数です。MyNewHandler から返される値は代入が再試行するかどうかを示すフラグです : 以外の値は割り当てに失敗したことの割り当てが再試行される値を示しますことを示します。
// crt_set_new_handler.cpp
// compile with: /c
#include <stdio.h>
#include <new.h>
#define BIG_NUMBER 0x1fffffff
int coalesced = 0;
int CoalesceHeap()
{
coalesced = 1; // Flag RecurseAlloc to stop
// do some work to free memory
return 0;
}
// Define a function to be called if new fails to allocate memory.
int MyNewHandler( size_t size )
{
printf("Allocation failed. Coalescing heap.\n");
// Call a function to recover some heap space.
return CoalesceHeap();
}
int RecurseAlloc() {
int *pi = new int[BIG_NUMBER];
if (!coalesced)
RecurseAlloc();
return 0;
}
int main()
{
// Set the failure handler for new to be MyNewHandler.
_set_new_handler( MyNewHandler );
RecurseAlloc();
}
同等の .NET Framework 関数
該当なし標準 C 関数を呼び出すには、PInvoke を使用します。詳細については、「プラットフォーム呼び出しの例」を参照してください。