memory[meta header]
std[meta namespace]
class template[meta id-type]
cpp11[meta cpp]
namespace std {
// 単一オブジェクト版
template <class T , class D = std::default_delete<T>>
class unique_ptr ;
// 配列版
template <class T , class D >
class unique_ptr <T[], D>;
}
default_delete[link /reference/memory/default_delete.md]
unique_ptr
は指定されたリソースへのポインタの所有権(ownership)を唯一(unique)持っているように振舞うスマートポインタである。auto_ptr
を置き換えるものとしてC++に追加された。
unique_ptr
はコピー不可能なクラスである。代わりにムーブによって所有権を他のunique_ptr
へ譲渡することができる。また、shared_ptr
はunique_ptr
を受け取るムーブコンストラクタとムーブ代入演算子を持つ。
new[]
演算子で作成された配列へのポインタにも対応している。
T[]
時にdelete[]
を呼び出すようにdefault_delete
を特殊化している。auto_ptr
では配列を渡すことができなかった(正確にはデストラクタでdelete[]
ではなくdelete
が呼び出されるため上手く動作しない)。
unique_ptr
自体もT[]
時には部分特殊化され、operator[]
によるアクセスを提供している。
単一オブジェクト版(unique_ptr)固有のメンバ関数
配列版(unique_ptr<T[ ]>)固有のメンバ関数
名前
説明
対応バージョン
pointer
所有するリソースのポインタ型element_type*
(T*
) 。ただし、deleter_type::pointer
型が存在する場合はその型になる。
C++11
element_type
要素型T
C++11
deleter_type
デリータの型D
C++11
名前
説明
対応バージョン
operator==
等値比較
C++11
operator!=
非等値比較
C++11
operator<
左辺が右辺より小さいかを判定する
C++11
operator<=
左辺が右辺以下かを判定する
C++11
operator>
左辺が右辺より大きいかを判定する
C++11
operator>=
左辺が右辺以上かを判定する
C++11
swap
2つのunique_ptr
オブジェクトを入れ替える
C++11
make_unique
unique_ptr
を構築するヘルパ関数
C++14
template<class E, class T, class Y, class D>
basic_ostream<E, T>& operator<<(basic_ostream<E, T>& os, const unique_ptr<Y, D>& p);
保持するポインタ値を出力する。この関数はos << p.get()
が有効である場合にのみオーバーロード解決に参加する。
C++17
名前
説明
対応バージョン
template <class T> struct hash;
hash
クラスの先行宣言
C++11
template <class T, class D> struct hash<unique_ptr<N>>;
hash
クラスのunique_ptr
に対する特殊化
C++11
#include < cstdlib>
#include < memory>
#include < iostream>
struct hoge {
hoge () { std::cout << " hoge::hoge()" << std::endl; }
~hoge () { std::cout << " hoge::~hoge()" << std::endl; }
};
int main () {
std::unique_ptr<hoge> p0 (new hoge ());
// hogeオブジェクトの所有権をp0からp1に移動
// p0は何も所有していない状態になる
std::unique_ptr<hoge> p1 (std::move (p0));
if (p0) {
std::abort (); // p0は空
}
// p1が所有しているリソースが解放される
}
std::move[link /reference/utility/move.md]
std::abort[link /reference/cstdlib/abort.md]
hoge::hoge()
hoge::~hoge()