• Class / Function / Type

      std::
    • Header file

      <>
    • Other / All

    最終更新日時(UTC):
    が更新

    履歴 編集

    function
    <memory>

    std::weak_ptr::lock

    shared_ptr<T> lock() const noexcept;
    

    概要

    監視しているshared_ptrオブジェクトを取得する。

    戻り値

    expired() ? shared_ptr<T>() : shared_ptr<T>(*this)
    

    監視しているshared_ptrオブジェクトが有効な状態なら、そのshared_ptrオブジェクトとリソースを共有するshared_ptrオブジェクトを作って返す。これによって、ロックしている間、shared_ptrオブジェクトの寿命が尽きないようにする。

    監視しているshared_ptrオブジェクトが寿命切れ状態なら、空のshared_ptrオブジェクトを作って返す。

    • C++14 : 上記に相当することをアトミックに実行する。

    備考

    この関数がshared_ptrオブジェクトではなく生ポインタを返す設計になっていない理由を解説する。以下のコードを考えてみよう:

    std::shared_ptr<int> sp(new int(3));
    std::weak_ptr<int> wp = sp;
    
    // …この間に、spの寿命が切れるかもしれない…
    
    if (int* r = wp.lock()) {
      std::cout << *r << std::endl;
    }
    

    このコードの場合、ロックを取得したif文内で、shared_ptrオブジェクトspに対してreset()が呼ばれると、ポインタrがダングリングポインタ(dangling pointer : 不正な領域を指すポインタ)になってしまう。

    この関数がshared_ptrオブジェクトを返す設計になっていることで、ロック取得したポインタがダングリングポインタになってしまう問題を回避できる。

    例外

    投げない

    #include <iostream>
    #include <memory>
    
    int main()
    {
      std::shared_ptr<int> sp(new int(3));
      std::weak_ptr<int> wp = sp;
    
      // …この間に、spの寿命が切れるかもしれない…
    
      // wpが監視しているshared_ptrオブジェクトの
      // 寿命が切れていなければ処理する
      if (std::shared_ptr<int> r = wp.lock()) {
        std::cout << *r << std::endl;
      }
      else {
        // shared_ptrオブジェクトの寿命が切れている
        std::cout << "sp is expired" << std::endl;
      }
    }
    

    出力

    3
    

    バージョン

    言語

    • C++11

    処理系

    参照