• Class / Function / Type

      std::
    • Header file

      <>
    • Other / All

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

    履歴 編集

    function
    <memory>

    std::shared_ptr::デストラクタ

    ~shared_ptr();
    

    shared_ptrオブジェクトの破棄

    自身のみが所有権を持つ場合に、リソースを解放する。

    効果

    他のshared_ptrオブジェクトとリソースを共有している場合(use_count() > 1)、効果なし。

    自身のみがshared_ptrオブジェクトのリソースを所有している場合、コンストラクタ代入演算子reset()メンバ関数で代入されたY*型のポインタpについて、

    • デリータを持っていればd(p)でリソースを解放する。
    • デリータを持っていなければ、delete pでリソースを解放する。

    pT*型ではなくY*型であることに注意。これにより、shared_ptr<void>に対して任意の型Yのオブジェクトへのポインタを代入したとしても、Y型のデストラクタが正しく実行される。

    備考

    実際にはshared_ptrは参照カウントで実装されるため、他のshared_ptrオブジェクトと所有権を共有している状態でデストラクタが実行された場合、参照カウントを1減らす、ということを行う。

    #include <iostream>
    #include <memory>
    
    struct X {
      ~X()
      {
        std::cout << "X dtor" << std::endl;
      }
    };
    
    struct Y {
      ~Y()
      {
        std::cout << "Y dtor" << std::endl;
      }
    };
    
    int main()
    {
      std::shared_ptr<void> p(new X());
    
      std::cout << 0 << std::endl;
    
      p.reset(new Y()); // Xが破棄される
    
      std::cout << 1 << std::endl;
    } // Yが破棄される
    

    出力

    0
    X dtor
    1
    Y dtor