Skip to content

Latest commit

 

History

History
70 lines (51 loc) · 1.79 KB

op_destructor.md

File metadata and controls

70 lines (51 loc) · 1.79 KB

デストラクタ

  • memory[meta header]
  • std[meta namespace]
  • shared_ptr[meta class]
  • function[meta id-type]
  • cpp11[meta cpp]
~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が破棄される
  • p.reset[link reset.md]

出力

0
X dtor
1
Y dtor