最終更新日時(UTC): 2025年07月11日 17時16分44秒
Koichi Murase が更新

履歴 編集

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_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が所有しているリソースが解放される
    }

### 出力

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

## バージョン

### 言語

- C++11

### 処理系

- Clang: ??
- GCC: 4.4 ✅, 4.7.2 ✅
- ICC: ??
- Visual C++: 2010 ✅

## 関連項目

- `std::shared_ptr`の推論補助

## 参照

- C++11 右辺値参照・ムーブセマンティクス
- Rvalue Reference Recommendations for Chapter 20
  - `unique_ptr`の追加と`auto_ptr`の非推奨の提案文書。
- LWG Issue 673. `unique_ptr` update
  - `unique_ptr<void, Deleter>`を許可するために、インタフェースを改良した経緯
- LWG Issue 762. `std::unique_ptr` requires complete type?
- N4089 Safe conversions in `unique_ptr<T[]>`, revision 2