我在shared_ptr中遇到问题。为什么这段代码会抛出SEGV?

时间:2020-02-07 13:25:05

标签: c++

为什么此代码会引发SEGV?我有一个域共享ptr的两个简单结构。我收到“ SEGV在未知地址上”。

struct B;

struct A {
    shared_ptr<B> p;
};

struct B {
    shared_ptr<A> p;
};

int main() {
    shared_ptr<A> p1;
    shared_ptr<B> p2;
    p2->p = p1; // falls here

    return 0;
}

3 个答案:

答案 0 :(得分:7)

为什么这段代码会抛出SEGV?

因为默认的初始化共享指针指向null。您尝试通过此处的空指针访问不存在的对象:

p2->p = p1; // falls here
  ^

答案 1 :(得分:6)

您永远不会使p2实际上指向某处。就像有

B* p2 = nullptr;
p2->p = p1;

您需要将p2指向有效的地方:

auto p2 = std::make_shared<B>();

答案 2 :(得分:4)

p2是指针(在本例中为nullptr),但不是对象,您需要初始化指向新对象的指针;

{
  shared_ptr<A> p1(new A); // or std::make_shared()
  shared_ptr<B> p2(new B);
}

此后,您可以通过指针访问对象的成员。

建议:对指向一一引用的指针使用weak_ptr以避免对象破坏的错误。