_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。 _PNH在 New.h 中定義,是函式的傳回型別指標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。 新的處理常式 mode 指出是否在失敗時, malloc就是呼叫新的處理常式所設定的_set_new_handler。 預設情況下, malloc不會將新的處理常式呼叫上配置記憶體失敗。 您可以覆寫此預設行為,以便,當malloc無法配置記憶體, malloc在同一個呼叫新的處理常式,就像new運算子不會因相同原因而失敗時。 若要覆寫預設值,請撥:
_set_new_mode(1)
在您的程式或具有 Newmode.obj 的連結。
如果使用者定義operator new會提供新的處理常式函式不會自動呼叫失敗。
如需詳細資訊,請參閱新 和 刪除 在 C + + 語言參考。
沒有單一_set_new_handler為所有動態連結的 Dll 或可執行檔。 即使您呼叫_set_new_handler可能會由另一個取代您的處理常式,或儲存的遊戲替換另一個 DLL 或可執行檔所設定的處理常式。
需求
常式 |
所需的標頭 |
---|---|
_set_new_handler |
<new.h> |
如需相容性資訊,請參閱相容性在簡介中。
範例
在這個範例中,當配置失敗時,控制將轉移到 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。 如需詳細資訊,請參閱平台叫用範例。