_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。 如需詳細資訊,請參閱平台叫用範例

請參閱

參考

記憶體配置

calloc

free

realloc