Namespaces
Variants

std::set_new_handler

cppreference.net에서
< cpp | memory | new
 
 
유틸리티 라이브러리
일반 유틸리티
관계 연산자 (C++20에서 폐기됨)
정수 비교 함수
(C++20)(C++20)(C++20)    
(C++20)
스왑 및 타입 연산
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
공통 어휘 타입
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)



 
메모리 관리 라이브러리
할당자
메모리 리소스
초기화되지 않은 저장소 (C++20*까지)
가비지 컬렉터 지원 (C++23까지)
 
 
헤더에 정의됨 <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는 널 포인터입니다.

이 함수는 스레드 안전합니다. 모든 std::set_new_handler synchronizes-with 호출은 (std::memory_order 참조) 후속 std::set_new_handler 및 std::get_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

참고 항목

할당 함수
(함수)
현재 new 핸들러를 얻음
(함수)
new 핸들러의 함수 포인터 타입
(typedef)
메모리 할당 실패 시 발생하는 예외
(클래스)