最終更新日時: 2023年01月18日 18時08分13秒 (JST)
onihusube が更新

履歴 編集

function
<new>

# ::operator delete

    void operator delete(void* ptr) throw();                                                // (1) C++03 まで
    void operator delete(void* ptr) noexcept;                                               // (1) C++11 から

    void operator delete(void* ptr, std::size_t size) noexcept;                             // (2) C++14 から

    void operator delete(void* ptr, std::align_val_t alignment) noexcept;                   // (3) C++17 から

    void operator delete(void* ptr, std::size_t size, std::align_val_t alignment) noexcept; // (4) C++17 から

    void operator delete(void* ptr, const std::nothrow_t&) throw();                              // (5) C++03 まで
    void operator delete(void* ptr, const std::nothrow_t&) noexcept;                             // (5) C++11 から

    void operator delete(void* ptr, std::align_val_t alignment, const std::nothrow_t&) noexcept; // (6) C++17 から

    void operator delete(void* ptr, void*) throw();                                     // (7) C++03 まで
    void operator delete(void* ptr, void*) noexcept;                                    // (7) C++11 から

## 概要

動的に確保された単一オブジェクトの記憶域を解放する。

- (1) : 単純な記憶域の解放
- (2) : オブジェクトサイズが判明している場合の、単一オブジェクトの記憶域の解放
- (3) : デフォルトより大きいアライメント要求の、単一オブジェクトの記憶域の解放
- (4) : オブジェクトサイズが判明している場合の、デフォルトより大きいアライメント要求の、単一オブジェクトの記憶域の解放
- (5) : 単純な記憶域の解放。例外を送出しない設定で記憶域を確保されたオブジェクトに対する、単一オブジェクトの記憶域の解放
- (6) : 単純な記憶域の解放。例外を送出しない設定で記憶域を確保されたオブジェクトに対する、デフォルトより大きいアライメント要求の、単一オブジェクトの記憶域の解放
- (7) : 配置newで確保された記憶域の解放

## 効果

`new`演算子によって動的に確保した記憶域を解放する。

`nothrow`版の`delete`演算子は、`nothrow`版の`new`演算子によって生成されたオブジェクトのコンストラクタが例外を送出した場合に呼び出される。

## 備考

- `alignment` 引数を取らない `delete` 演算子に渡される `ptr` は、 `alignment` 引数を取らない `new` 演算子によって確保されたものでなければならない。
- `alignment` 引数を取る `delete` 演算子に渡される `ptr` は、同じ `alignment` の値を取った `alignment` 版 `new` 演算子によって確保されたものでなければならない。

## 例

    #include <iostream>
    #include <new>

    int main()
    {
      try {
        // int型変数を動的に作成
        // 確保失敗時にbad_alloc例外が送出される
        int* p1 = new int();
        delete p1; // p1の領域を解放

        // int型変数を動的に作成
        // 確保失敗時にヌルポインタが返される
        int* p2 = new (std::nothrow) int();
        delete p2;
      }
      catch (std::bad_alloc& e) {
        std::cout << e.what() << std::endl;
        throw;
      }
    }

### 出力

## 関連項目

- C++14 サイズ付きデアロケーション
- C++17 アライメント指定されたデータの動的メモリ確保

## 参照

- LWG 2458. N3778 and new library deallocation signatures