最終更新日時: 2026年01月06日 12時47分59秒 (JST)
Koichi Murase が更新

履歴 編集

class
<new>

# std::nothrow_t

    namespace std {
      struct nothrow_t { explicit nothrow_t() = default; };
      extern const nothrow_t nothrow;
    }

## 概要

`nothrow_t`は、`new`失敗時に例外を送出させないための型である。

`nothrow`は、`std::nothrow_t`型の定数であり、`new`キーワードに指定するタグとして使用する。

    #include <iostream>
    #include <new>

    struct ThrowObj
    {
      ThrowObj()
      {
        throw std::logic_error("logic_error: ThrowObj::ThrowObj()");
      }
    };

    int main()
    {
      // 長さ3の動的配列を作成する
      // 領域確保に失敗した場合、nullptrが返される
      int* p = new(std::nothrow) int[3];

      // ただし、オブジェクトのコンストラクタが例外を投げる場合は
      // 例外が送出されることに注意
      try
      {
        ThrowObj* obj = new(std::nothrow) ThrowObj();
        delete obj;
      }
      catch (std::logic_error& e)
      {
        // この場合でもnew(std::nothrow)で確保されたメモリは解放されている。
        std::cout << e.what() << std::endl;
      }
    }

### 出力

    logic_error: ThrowObj::ThrowObj()

## 参照

- LWG Issue 2510. Tag types should not be `DefaultConstructible`