_set_new_handler
new 演算子がメモリの割り当てに失敗した場合は、独自のエラー処理機構に制御を移します。
_PNH _set_new_handler(
_PNH pNewHandler
);
パラメーター
- pNewHandler
アプリケーションが指定したメモリ処理関数へのポインター。 0 番目の new ハンドラーを削除します。
戻り値
前の関数が後で復元できるように _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 以外の値再試行する、関数は 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 ハンドラー モード。 new ハンドラー モードは、エラーが発生した場合、malloc ように _set_new_handlerで設定された new ハンドラー ルーチンを呼び出すかどうかを示します。 既定では、malloc は、メモリの割り当てエラーの際に新しいハンドラー ルーチンを呼び出しません。 この既定の動作をオーバーライドすると、malloc がメモリの割り当てに失敗したときに、new 演算子が同じ理由で失敗したときと同じ方法で、malloc によって新しいハンドラー ルーチンを呼び出すことができます。 既定の名前をオーバーライドするには、ODBC API 関数:
_set_new_mode(1)
高速 Newmode.obj のプログラムまたはリンクです。
ユーザー定義の operator newが提供されると、new ハンドラー関数は自動的に対してエラーではありません。
詳細については、" C++ Language Reference" new と 削除 を参照します。
すべての動的にリンクされたな DLL または実行可能ファイルの _set_new_handler 単一のハンドラーがあり、; _set_new_handler を呼び出して、ハンドラーは別の置換されるかは、別の DLL によって設定または実行可能ファイル ハンドラーを置き換えます。
必要条件
ルーチン |
必須ヘッダー |
---|---|
_set_new_handler |
<new.h> |
互換性の詳細については、「C ランタイム ライブラリ」の「互換性」を参照してください。
使用例
この例では、割り当てが失敗した場合、コントロールは MyNewHandler に転送されます。 MyNewHandler に渡された引数が要求されたバイト数です。 MyNewHandler から返される値は、割り当てを再試行するかどうかを示すフラグです: 0 以外の値は割り当てが失敗したことを割り当てを再試行する必要のある値を使用することを示します。
// 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 を使用します。詳細については、「プラットフォーム呼び出しの例」を参照してください。