我正在使用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;
并实现一个名为 name 的 std::string ,Base
其中每个实例都不同,我可以看到析构函数被多次调用(因为Base::parent
我认为是引用)。那当然触发了我的错误,但我仍然不明白它为什么会发生,因为shared_ptr<Base>
预计会在实际销毁它之前计算它的引用!!?
我希望有人能告诉我我做错了什么!但更重要的是,我该如何解决这个问题!