最終更新日時:
が更新

履歴 編集

class template
<memory>

std::unique_ptr(C++11)

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

名前 説明 対応バージョン
operator* 間接参照 C++11
operator-> メンバアクセス C++11

配列版(unique_ptr<T[ ]>)固有のメンバ関数

名前 説明 対応バージョン
operator[] 任意の位置の要素にアクセス C++11

メンバ型

名前 説明 対応バージョン
pointer 所有するリソースのポインタ型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 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が所有しているリソースが解放される
}

出力

hoge::hoge()
hoge::~hoge()

バージョン

言語

  • C++11

処理系

参照