GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • cpprefjp - C++日本語リファレンス
  • GitHub Project

This view

  • Original page
  • New address

GeezerVison is showing cpprefjp.github.io — std::weak_ptr - cpprefjp C++日本語リファレンス

  1. リファレンス
  2. memory
  3. weak_ptr

最終更新日時: 2026年09月11日 13時06分31秒 (JST)
Akira Takahashi が更新

履歴 編集

class template
<memory>

std::weak_ptr(C++11)

namespace std {
  template <class T>
  class weak_ptr;
}

概要

weak_ptrは、shared_ptrオブジェクトが持つリソースへの弱参照を保持するクラスである。

このクラスは、shared_ptrオブジェクトのリソースに対する所有権は保持せず、そのリソースを監視し、覗き見する。

循環参照の解決に使用する

shared_ptrは、所有権を参照カウントで管理し、所有者がいなくなったらリソースを解放するクラスである。

しかし、参照カウントという機構には、循環参照を解決できないという問題がある。AがBへのshared_ptrを保持し、BもまたAへのshared_ptrを保持する、ということをした場合、参照カウントが永遠に0にならず、リソースリークが発生する。

このような構造がどうしても必要な場合、一方はshared_ptrを保持し、一方はそのshared_ptrへのweak_ptrを保持する、というようにすることで、循環参照を解決できる。

weak_ptrは、監視対象のshared_ptrオブジェクトの参照カウントを、加算も減算もしない。

shared_ptrは、リソースを使用している間は解放されないという保証があるということも特徴の一つではあるので、weak_ptrにする対象が、リソースが参照できなくなっても問題ないか、ということを確認した上で使用すること。

メンバ関数

名前 説明 対応バージョン
(constructor) コンストラクタ C++11
(destructor) デストラクタ C++11
operator= 代入演算子 C++11
swap 他のweak_ptrオブジェクトとデータを入れ替える C++11
reset weak_ptrオブジェクトと監視対象とのリンクをクリアする C++11
use_count 監視しているshared_ptrオブジェクトの所有者数を取得する C++11
expired 監視対象の寿命切れやリンク切れを判定する C++11
lock 監視しているshared_ptrオブジェクトを取得する C++11
owner_before 所有権ベースでの小なり比較を行う C++11
owner_equal 所有権ベースでの等値比較を行う C++26
owner_hash 所有権ベースでのハッシュ値を取得する C++26

メンバ型

名前 説明 対応バージョン
element_type 監視するインスタンスの型
C++11 : T
C++17 : remove_extent_t<T>(配列型U[N], U[]に対してはU)
C++11

非メンバ関数

名前 説明 対応バージョン
swap 2つのweak_ptrオブジェクトを入れ替える C++11

推論補助

名前 説明 対応バージョン
(deduction_guide) クラステンプレートの推論補助 C++17

例

#include <memory>
#include <iostream>

int main()
{
  // weak_ptrオブジェクトwpは、
  // shared_ptrオブジェクトspを監視する
  std::shared_ptr<int> sp(new int(42));
  std::weak_ptr<int> wp = sp;

  // wpの監視対象であるspが、有効なリソースを保持している状態なら処理する。
  if (std::shared_ptr<int> r = wp.lock()) {
    std::cout << "get weak_ptr value : " << *r << std::endl;
  }

  sp.reset();

  // shared_ptrオブジェクトが無効になったことを検知する
  if (wp.expired()) {
    std::cout << "shared_ptr managed object deleted." << std::endl;
  }
}

出力

get weak_ptr value : 42
shared_ptr managed object deleted.

バージョン

言語

  • C++11

処理系

  • Clang: 3.0 ✅
  • GCC: 4.3.6 ✅
  • Visual C++: 2008 (TR1) ✅, 2010 ✅, 2012 ✅, 2013 ✅

参照

  • LWG Issue 1231. weak_ptr comparisons incompletely resolved
    • C++11で、operator<が削除され、このクラスに要求される要件からLessThanComparableが削除された
  • LWG Issue 1256. weak_ptr comparison functions should be removed
    • C++11で、delete定義されていた比較演算子のメンバ宣言が削除された。演算子をdelete定義しなくても、比較演算子が定義されていなければ比較できないため
  • LWG Issue 3001. weak_ptr::element_type needs remove_extent_t
    • C++20で、shared_ptrの配列対応に合わせてelement_typeがremove_extent_t<T>となるよう修正された。この修正は欠陥報告(DR)であり、C++17にも遡及して適用される
You are visitor 01402503 — GeezerVison does not store the pages you look up.
Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.