Namespaces
Variants

std:: set_new_handler

From cppreference.net
< cpp ‎ | memory ‎ | new
Utilities library
Memory management library
( exposition only* )
Allocators
Uninitialized memory algorithms
Constrained uninitialized memory algorithms
Memory resources
Uninitialized storage (until C++20)
( until C++20* )
( until C++20* )
( until C++20* )

Garbage collector support (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until 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 関数は、メモリ割り当ての試行が失敗した際に 割り当て関数 によって呼び出される関数です。その目的は、以下の3つのいずれかです:

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 へのすべての呼び出しは、後続の std::set_new_handler および std::memory_order 呼び出しと 同期します std::get_new_handler を参照)。

(C++11以降)

目次

パラメータ

new_p - std::new_handler 型の関数へのポインタ、またはヌルポインタ

戻り値

以前にインストールされていた 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)
メモリ確保失敗時にスローされる例外
(クラス)