gpt4 book ai didi

C++ shared_ptr 指针访问冲突

转载 作者:太空宇宙 更新时间:2023-11-04 15:06:13 25 4
gpt4 key购买 nike

我正在使用 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 << “破坏” << 名称 << std::endl;

并在 Base 中实现一个名为 name 的 std::string每个实例都不同,我可以看到析构函数被多次调用(因为我认为是 Base::parent 引用)。那当然触发了我的错误,但我仍然不明白为什么会发生,因为 shared_ptr<Base>应该在实际销毁它之前计算它的引用!!?

我希望有人能告诉我我做错了什么!但更重要的是,我该如何解决这个问题!

最佳答案

看看add()中的这一行

i->parent = pBase(this);

每次调用 add 时,都会创建一个指向 this共享指针。这些共享指针是独立的——也就是说,它们不是如您所想的“共享”。因此,第一次删除子项时,它的父项也会被删除(因为它是共享指针)。因此你的代码爆炸了。

尝试(作为开始)让 parent 成为一个普通的哑指针。

Base *parent;

关于C++ shared_ptr<Base> 指针访问冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14366029/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com