std::set_new_handler
cppreference.net에서
| 헤더에 정의됨 <new>
|
||
std::new_handler set_new_handler( std::new_handler new_p ) throw();
|
(C++11까지) | |
std::new_handler set_new_handler( std::new_handler new_p ) noexcept;
|
(C++11부터) | |
new_p를 새로운 전역 new-handler 함수로 설정하고 이전에 설치된 new-handler를 반환합니다.
new-handler 함수는 메모리 할당 시도가 실패할 때마다 할당 함수들에 의해 호출되는 함수입니다. 의도된 목적은 다음 세 가지 중 하나입니다:
1) 더 많은 메모리를 사용 가능하게 하거나,
2) 프로그램을 종료하거나 (예: std::terminate 호출),
3) std::bad_alloc 타입 또는 std::bad_alloc에서 파생된 예외를 던집니다.
기본 구현은 std::bad_alloc을 던집니다. 사용자는 자신만의 new-handler를 설치할 수 있으며, 이는 기본 동작과 다른 동작을 제공할 수 있습니다.
만약 new-handler가 반환되면, 할당 함수는 이전에 실패한 할당 시도를 반복하고, 할당이 다시 실패하면 new-handler를 다시 호출합니다. 루프를 종료하기 위해, new-handler는 std::set_new_handler(nullptr)를 호출할 수 있습니다: 실패한 할당 시도 후에 할당 함수가 std::get_new_handler가 널 포인터 값을 반환한다는 것을 발견하면, std::bad_alloc을 던질 것입니다.
프로그램 시작 시, new-handler는 널 포인터입니다.
|
이 함수는 스레드 안전합니다. 모든 |
(C++11부터) |
매개변수
| new_p | - | std::new_handler 타입의 함수에 대한 포인터, 또는 null 포인터 |
반환값
이전에 설치된 new 핸들러, 또는 설치된 것이 없을 경우 null 포인터 값.
예제
이 코드 실행
#include <iostream> #include <new> void handler() { std::cout << "Memory allocation failed, terminating\n"; std::set_new_handler(nullptr); } int main() { std::set_new_handler(handler); try { while (true) { new int[1000'000'000ul](); } } catch (const std::bad_alloc& e) { std::cout << e.what() << '\n'; } }
가능한 출력:
Memory allocation failed, terminating std::bad_alloc
참고 항목
|
할당 함수
(함수) |
|
|
(C++11)
|
현재 new 핸들러를 얻음
(함수) |
|
new 핸들러의 함수 포인터 타입
(typedef) |
|
|
메모리 할당 실패 시 발생하는 예외
(클래스) |