循環参照と所有権の共有訂正

なんか完全に間違えてました。本来は既に管理しているオブジェクトの一部をさす時に使うためのものなので、カスタムデリータが必要なんでした。

struct B;

struct A {
  weak_ptr<B> b;
};

struct B {
  weak_ptr<A> a;
};

struct Deleter {
  Deleter(B* b) : b(b) { }
  void operator()(A* a) {
    delete a;
    delete b;
  }
  B* b;
};

Deleter deleter(new B());
shared_ptr<A> a(new A(), deleter);
shared_ptr<B> b(a, deleter.b);
a->b = b;
b->a = a;

まあこんなのですね。疲れてるかなあ。