Namespaces
Variants

std::set_new_handler

ja.cppreference.net より
 
 
ユーティリティライブラリ
言語サポート
型サポート (基本型、RTTI)
ライブラリ機能テストマクロ (C++20)
プログラムユーティリティ
可変引数関数
コルーチンサポート (C++20)
契約サポート (C++26)
三方比較
(C++20)
(C++20)(C++20)(C++20)    
(C++20)(C++20)(C++20)

汎用ユーティリティ
リレーショナル演算子 (C++20で非推奨)
 
メモリ管理ライブラリ
アロケータ
メモリリソース
未初期化ストレージ (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-handler関数を設定し、new_p 以前に設定されていた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がnullポインタ値を返すことを検出した場合、std::bad_allocを投げます。

プログラム起動時、new-handlerはnullポインタです。

この関数はスレッドセーフです。std::set_new_handler へのすべての呼び出しは、その後の (std::memory_orderを参照) std::set_new_handler および 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)
メモリ確保失敗時にスローされる例外
(クラス)