namespace std {
// 単一オブジェクト版
template <class T, class D = std::default_delete<T>>
class unique_ptr;
// 配列版
template <class T, class D>
class unique_ptr<T[], D>;
}
概要
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[]
によるアクセスを提供している。
メンバ関数
名前 | 説明 | 対応バージョン |
---|---|---|
(constructor) |
コンストラクタ | C++11 |
(destructor) |
デストラクタ | C++11 |
operator= |
代入演算子 | C++11 |
release |
リソースの所有権を放棄する | C++11 |
reset |
リソースを解放し、新たなリソースの所有権を設定する | C++11 |
swap |
他のunique_ptr オブジェクトとデータを入れ替える |
C++11 |
get |
リソースを取得する | C++11 |
get_deleter |
デリータを取得する | C++11 |
operator bool |
有効なリソースを所有しているかを判定する | C++11 |
単一オブジェクト版(unique_ptr<T>)固有のメンバ関数
名前 | 説明 | 対応バージョン |
---|---|---|
operator* |
間接参照 | C++11 |
operator-> |
メンバアクセス | C++11 |
配列版(unique_ptr<T[]>)固有のメンバ関数
名前 | 説明 | 対応バージョン |
---|---|---|
operator[] |
任意の位置の要素にアクセス | C++11 |
メンバ型
名前 | 説明 | 対応バージョン |
---|---|---|
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++20 |
operator< |
左辺が右辺より小さいかを判定する | C++11 |
operator<= |
左辺が右辺以下かを判定する | C++11 |
operator> |
左辺が右辺より大きいかを判定する | C++11 |
operator>= |
左辺が右辺以上かを判定する | C++11 |
swap |
2つのunique_ptr オブジェクトを入れ替える |
C++11 |
make_unique |
unique_ptr を構築するヘルパ関数 |
C++14 |
operator<< |
ストリームへ出力する | C++17 |
ハッシュサポート
名前 | 説明 | 対応バージョン |
---|---|---|
template <class T> struct hash; |
hash クラスの先行宣言 |
C++11 |
template <class T, class D> struct hash<unique_ptr<T, D>>; |
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が所有しているリソースが解放される
}
xxxxxxxxxx
#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が所有しているリソースが解放される
}
出力
hoge::hoge()
hoge::~hoge()
バージョン
言語
- C++11
処理系
- Clang: ??
- GCC: 4.4 ✅, 4.7.2 ✅
- ICC: ??
- Visual C++: 2010 ✅
関連項目
参照
- C++11 右辺値参照・ムーブセマンティクス
- Rvalue Reference Recommendations for Chapter 20
unique_ptr
の追加とauto_ptr
の非推奨の提案文書。
- LWG Issue 673.
unique_ptr
updateunique_ptr<void, Deleter>
を許可するために、インタフェースを改良した経緯
- LWG Issue 762.
std::unique_ptr
requires complete type? - N4089 Safe conversions in
unique_ptr<T[]>
, revision 2