Visual Studio 2017을 사용하는 것이 좋습니다.

_set_new_handler

 

게시 날짜: 2016년 4월

Visual Studio 2017 에 대한 최신 설명서는 Visual Studio 2017 설명서를 참조하세요.

new 연산자가 메모리 할당에 실패하면 오류 처리 메커니즘에 제어를 전달합니다.

_PNH _set_new_handler(  
   _PNH pNewHandler   
);  

매개 변수

pNewHandler
응용 프로그램에서 제공하는 메모리 처리 함수에 대한 포인터입니다. 인수가 0이면 새 처리기가 제거됩니다.

나중에 이전 함수를 복원할 수 있도록 _set_new_handler에서 등록한 이전 예외 처리 함수에 대한 포인터를 반환합니다. 이전 함수가 설정되어 있지 않은 경우 반환 값을 사용하여 기본 동작을 복원할 수 있습니다. 이 값은 NULL일 수 있습니다.

C++ _set_new_handler 함수는 new 연산자가 메모리를 할당하지 못한 경우 컨트롤을 얻는 예외 처리 함수를 지정합니다. new가 실패하는 경우 런타임 시스템은 _set_new_handler에 대한 인수로 전달된 예외 처리 함수를 자동으로 호출합니다. New.h에 정의된 _PNHint 형식을 반환하고 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합니다. 새 처리기 모드는 실패 시 malloc_set_new_handler에서 설정한 대로 새 처리기 루틴을 호출하는지 여부를 나타냅니다. 기본적으로 malloc 실패 메모리 할당에 대 한 새 처리기 루틴을 호출 하지 않습니다. 이 기본 동작을 재정의할 수 있습니다 있도록 때 malloc 가 메모리 할당에 실패 malloc 동일한 새 처리기 루틴을 호출 방식으로 new 이와 같은 이유로 실패 한 경우 연산자는 하지 않습니다. 기본값을 재정의하려면 다음을

_set_new_mode(1)  

초기 프로그램 또는 Newmode.obj에 대한 링크에서 호출합니다.

사용자 지정 하는 경우 operator new제공 실패 시 새 처리기 함수는 자동으로 호출 되지 않습니다.

자세한 내용은 참조 삭제c + + 언어 참조합니다.

동적으로 연결된 모든 DLL 또는 실행 파일에 대한 단일 _set_new_handler 처리기가 있습니다. _set_new_handler를 호출하는 경우에도 처리기는 다른 DLL 또는 실행 파일을 설정하는 처리기를 대체하는 다른 처리기로 대체될 수 있습니다.

루틴필수 헤더
_set_new_handler<new.h>

호환성에 대한 자세한 내용은 소개 단원의 Compatibility 을 참조하세요.

이 예제에서는 할당이 실패하면 컨트롤이 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.  

해당 사항 없음. 표준 C 함수를 호출하려면 PInvoke를 사용합니다. 자세한 내용은 플랫폼 호출 예제를 참조하십시오.

메모리 할당
calloc
있음
realloc

표시: