namespace std {
// 単一オブジェクト版
template <class T>
struct default_delete;
// 配列版
template <class T>
struct default_delete<T[]>;
}
概要
default_delete
は、リソースを自動的に解放するスマートポインタクラスであるunique_ptr
において、デフォルトで使用されるデリータクラスである。unique_ptr
が配列を所有できるようにするため、T[]
時にはdelete[]
を呼びだすように特殊化される。
型T
が不完全型である場合、operator()
の実行は不適格となる。
単一オブジェクト版のメンバ関数
名前 | 説明 | 対応バージョン |
---|---|---|
constexpr default_delete() noexcept = default; |
コンストラクタ。 | C++11 |
template<class U> default_delete()(default_delete<U> const& other) noexcept; |
変換可能な型からのコピーコンストラクタ。 | C++11 C++23からconstexpr指定 |
~default_delete() = default; |
デストラクタ | C++11 |
void operator()(T* ptr) const; |
関数呼び出し演算子。渡されたポインタptr を delete ptr; で削除する |
C++11 C++23からconstexpr指定 |
配列版のメンバ関数
名前 | 説明 | 対応バージョン |
---|---|---|
constexpr default_delete() noexcept=default; |
デフォルトコンストラクタ。 | C++11 |
template <class U> default_delete()(const default_delete<U[]>&) noexcept; |
変換可能な型からのコピーコンストラクタ。 | C++17 C++23からconstexpr指定 |
~default_delete() = default; |
デストラクタ | C++11 |
void operator()(T* ptr) const; template <class U> void operator()(U*) const = delete; |
関数呼び出し演算子。渡されたポインタptr を delete[] ptr; で削除する |
C++11 C++14まで |
template <class U> void operator()(U* ptr) const; |
関数呼び出し演算子。渡されたポインタptr を delete[] ptr; で削除する。変換可能な型の配列へのポインタも削除可能。 |
C++17 C++23からconstexpr指定 |
例
#include <memory>
// default_deleteはunique_ptrのデフォルト引数として自動的に渡されるため、
// ここでは説明用に明示的にdefault_deleteを指定する
int main()
{
{
std::unique_ptr<int, std::default_delete<int>> p(new int());
*p = 3;
} // pが指しているintオブジェクトがdeleteされる
{
std::unique_ptr<int[], std::default_delete<int[]>> p(new int[3]);
for (std::size_t i = 0; i < 3; ++i) {
p[i] = i;
}
} // pが指しているint配列がdelete[]される
}
21
#include <memory>
// default_deleteはunique_ptrのデフォルト引数として自動的に渡されるため、
// ここでは説明用に明示的にdefault_deleteを指定する
int main()
{
{
std::unique_ptr<int, std::default_delete<int>> p(new int());
*p = 3;
} // pが指しているintオブジェクトがdeleteされる
{
std::unique_ptr<int[], std::default_delete<int[]>> p(new int[3]);
for (std::size_t i = 0; i < 3; ++i) {
p[i] = i;
}
出力
バージョン
言語
- C++11
処理系
- Clang: ??
- GCC: 4.4 ✅, 4.7.2 ✅
- ICC: ??
- Visual C++: 2010 ✅, 2012 ✅, 2013 ✅