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

Арт*_*вый 1 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;
}
Run Code Online (Sandbox Code Playgroud)

eer*_*ika 7

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

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

p2->p = p1; // falls here
  ^
Run Code Online (Sandbox Code Playgroud)


Som*_*ude 6

你永远不会p2真正指出某个地方。这就像拥有

B* p2 = nullptr;
p2->p = p1;
Run Code Online (Sandbox Code Playgroud)

你需要p2在某个有效的地方表明观点:

auto p2 = std::make_shared<B>();
Run Code Online (Sandbox Code Playgroud)