namespace std {
// 単一オブジェクト版
template <class T>
struct default_delete;
// 配列版
template <class T>
struct default_delete<T[]>;
}
概要
default_deleteは、リソースを自動的に解放するスマートポインタクラスであるunique_ptrにおいて、デフォルトで使用されるデリータクラスである。unique_ptrが配列を所有できるようにするため、T[]時にはdelete[]を呼びだすように特殊化される。
テンプレートパラメータTには不完全型を指定してよい。ただし、型Tが不完全型である場合、operator()の実行は不適格となる。
単一オブジェクト版のメンバ関数
| 名前 | 説明 | 対応バージョン |
|---|---|---|
(constructor) |
コンストラクタ | C++11 |
operator() |
渡されたポインタをdeleteで削除する |
C++11 |
配列版のメンバ関数
| 名前 | 説明 | 対応バージョン |
|---|---|---|
(constructor) |
コンストラクタ | C++11 |
operator() |
渡されたポインタをdelete[]で削除する |
C++11 |
デストラクタは宣言されておらず、暗黙に定義される。
例
#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[]される
}
出力
バージョン
言語
- C++11
処理系
- Clang: ??
- GCC: 4.4 ✅, 4.7.2 ✅
- ICC: ??
- Visual C++: 2010 ✅, 2012 ✅, 2013 ✅
関連項目
参照
- LWG Issue 1193.
default_deletecannot be instantiated with incomplete types- C++11で、テンプレートパラメータ
Tが不完全型であってもよいことが明記された。不完全型を扱うunique_ptrを宣言できるようにするため
- C++11で、テンプレートパラメータ
- N4089 Safe conversions in
unique_ptr<T[]>, revision 2- C++17で、配列版に変換コンストラクタが追加され、関数呼び出し演算子が制約付きのテンプレートへ置き換えられた
- P2273R3 Making
std::unique_ptrconstexpr