Skip to content

Latest commit

 

History

History
150 lines (113 loc) · 7.36 KB

unique_ptr.md

File metadata and controls

150 lines (113 loc) · 7.36 KB

unique_ptr

  • 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_ptrunique_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)固有のメンバ関数

名前 説明 対応バージョン
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++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()

バージョン

言語

  • C++11

処理系

参照

関連項目