shared_ptr<Base>
派生クラスを持つある種のツリーリストに使用しています。しかし、ツリーが破壊されると、ポインターアクセス違反が発生します。
私のコードは次のようになります。さらに、これは実際に私のランタイムエラーをシミュレートします。
#include <iostream>
#include <memory>
#include <vector>
class Base;
typedef std::shared_ptr<Base> pBase;
class Derived;
class Base {
public:
std::vector<pBase> children;
pBase parent;
Base() {}
virtual ~Base() {}
virtual void doSomething() {}
void add(pBase i);
};
class Derived : public Base {
void doSomething() {
// Do something...
}
};
void Base::add(pBase i) {
i->parent = pBase(this);
children.push_back(i);
}
int main() {
pBase tree = pBase(new Derived());
pBase child(new Derived());
child->add(pBase(new Derived()));
tree->add(child);
}
また、次の行を次のように追加すると、次のようになりますBase::~Base
。std :: cout << "destruct" << name << std :: endl;
Base
そして、インスタンスごとに異なるnameというstd :: stringを実装すると、デストラクタが複数回呼び出されていることがわかります(Base::parent
参照のためだと思います)。もちろんそれが私のエラーを引き起こしましたが、shared_ptr<Base>
実際にそれを破壊する前にその参照を数えることが期待されているので、なぜそれが起こるのかまだわかりません!!?
私が間違っていることを誰かが教えてくれることを願っています!しかし、もっと重要なのは、これをどのように修正できるかです!