' P '

whatever I will forget

C++ Smart Pointer - Weak Pointer

こんなややこしいポインタを使う時があるのか疑問ですがメモw

weak pointerの特徴まとめ

  • shared_ptrから必ず生成される
  • 使用カウントはインクリメントもデクリメントもされない
  • 所持関係を持たない
  • 複雑な参照サイクル時にオブジェクトが削除されなくなってしまうことを防ぐために使用する

下記コードのように、各Classのメソッドに違うクラスのポインタのアドレスを参照させるような場合。
先に言いますが問題は、Destructorがcallされずにメモリリークが起こってしまうこと。

#include <iostream>
#include <memory>

using namespace std;

class B;

class A{
  shared_ptr<B> b_ptr;
public:
  void set_B(shared_ptr<B> &b){
    b_ptr = b;
  }
  A() {cout << "class A constructor called" << endl;}
  ~A() {cout << "class A destructor called" << endl;}
};

class B{
  shared_ptr<A> a_ptr;  //19行目 ここを、weak_ptr<A> a_ptr; に変える
public:
  void set_A(shared_ptr<A> &a){
    a_ptr = a;
  }
  B() {cout << "class B constructor called" << endl;}
  ~B() {cout << "class B destructor called" << endl;}
};

int main() {
  shared_ptr<A> a = make_shared<A>();
  shared_ptr<B> b = make_shared<B>();

  a->set_B(b);
  b->set_A(a);

  return 0;
}

実行結果

class A constructor called  
class B constructor called  

こういう場合にsharedポインタは怖いってこと?w
なので、weak pointerをそういう場合は使うようだ
上記19行目のコメントにあるように、weak pointerに差し替えるだけでdestructorが呼ばれるようになる。