_set_new_handler
更新 : 2007 年 11 月
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 関数はメモリの割り当てに失敗しても new ハンドラ ルーチンを呼び出しません。既定の動作をオーバーライドすると、new 演算子がメモリの割り当てに失敗したときと同じように、malloc 関数がメモリの割り当てに失敗した場合にも、malloc 関数は new ハンドラのルーチンを呼び出すことができます。既定の動作をオーバーライドするには、プログラム内の早い段階で次の関数を呼び出すか、または Newmode.obj とリンクします。
_set_new_mode(1)
ユーザー定義の operator new を与えた場合、メモリ割り当てが失敗すると、new ハンドラは自動的には呼び出されません。
詳細については、『C++ Language Reference』の new および delete の説明を参照してください。
動的にリンクされるすべての DLL または実行可能ファイルに対し、_set_new_handler ハンドラは 1 つだけです。そのため、_set_new_handler を呼び出しても、ハンドラが別のハンドラに置き換えられたり、別の DLL または実行可能ファイルで設定されたハンドラを置き換えたりする場合があります。
必要条件
ルーチン |
必須ヘッダー |
---|---|
_set_new_handler |
<new.h> |
互換性の詳細については、「C ランタイム ライブラリ」の「互換性」を参照してください。
使用例
この例では、割り当てに失敗すると、制御は MyNewHandler に移ります。MyNewHandler に渡される引数は、要求したバイト数です。MyNewHandler から返される値は、割り当てを再試行するかどうかを示すフラグです。0 以外の値は、割り当てを再試行することを示し、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();
}
Allocation failed. Coalescing heap.
This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.
.NET Framework の相当するアイテム
適用できません。標準 C 関数を呼び出すには、PInvoke を使用します。詳細については、「プラットフォーム呼び出しの例」を参照してください。