为什么此代码会引发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;
}
答案 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以避免对象破坏的错误。