最終更新日時:
が更新

履歴 編集

function
<memory>

std::default_delete::operator()(C++11)

// 単一オブジェクト版
void operator()(T* ptr) const;                 // (1) C++11
constexpr void operator()(T* ptr) const;       // (1) C++23

// 配列版 (default_delete<T[]>)
void operator()(T* ptr) const;                 // (2) C++11
                                               //     C++14まで
template <class U>
void operator()(U* ptr) const = delete;        // (3) C++11
                                               //     C++14まで

template <class U>
void operator()(U* ptr) const;                 // (4) C++17
template <class U>
constexpr void operator()(U* ptr) const;       // (4) C++23

概要

渡されたポインタが指すオブジェクトを削除する。

  • (1) : deleteによって単一オブジェクトを削除する
  • (2), (4) : delete[]によって配列を削除する
  • (3) : T*以外のポインタを受け取らないようにするための、delete定義されたオーバーロード

テンプレートパラメータ制約

適格要件

効果

  • (1) : delete ptr;を呼び出す
  • (2), (4) : delete[] ptr;を呼び出す

戻り値

なし

備考

  • (3) : 配列版にT*へ暗黙変換できる派生クラスのポインタを渡せてしまうと、要素サイズの不一致によりdelete[]が誤った動作をする。これを防ぐため、T*以外を受け取るオーバーロードdelete定義されていた。
  • (4) : C++17で(2)と(3)がこのオーバーロードに置き換えられた。U(*)[]からT(*)[]への変換 (int[]からconst int[]への変換など) が可能な場合に限って呼び出せるため、delete定義されたオーバーロードを別途用意する必要がなくなった。

#include <memory>
#include <iostream>

struct X {
  ~X() { std::cout << "~X()" << std::endl; }
};

int main()
{
  // (1) 単一オブジェクトの削除
  std::default_delete<X> d1;
  d1(new X());

  // (2), (4) 配列の削除
  std::default_delete<X[]> d2;
  d2(new X[2]);
}

出力

~X()
~X()
~X()

バージョン

言語

  • C++11

関連項目

参照