shared_ptr 的未知行为
Unknown behavior with shared_ptr
我有一个示例代码如下
#include <iostream>
#include <memory>
using namespace std;
class A {
public:
int n = 0;
};
class B {
public:
shared_ptr<A> ba;
};
class C {
public:
shared_ptr<A> ca;
shared_ptr<B> cb;
};
int main () {
cout << "Hello\n";
C c;
shared_ptr<A> a(new A);
c.ca = a;
c.cb->ba = a; // MAYBE PROBLEM HERE
return 0;
}
这段代码编译成功,但是当我运行时,它甚至不打印"Hello"。
我是 C++ 和智能指针的新手。请帮我解释一下这里的问题。
提前致谢!
您的代码的可能修复:
#include <iostream>
#include <memory>
using namespace std;
class A {
public:
int n = 0;
};
class B {
public:
shared_ptr<A> ba;
};
class C {
public:
C() {
cb = make_shared<B>();
}
shared_ptr<A> ca;
shared_ptr<B> cb;
};
int main () {
cout << "Hello\n";
C c;
shared_ptr<A> a = make_shared<A>();
c.ca = a;
c.cb->ba = a; // PROBLEM FIXED in constructor
return 0;
}
这是未定义的行为。
您永远不会创建 B 的实例,并且在行 c.cb->ba = a; // MAYBE PROBLEM HERE
上您正在取消引用一个空指针,即 UB。
请注意,共享指针默认构造为 nullptr,而不是拥有类型的默认构造函数。
我有一个示例代码如下
#include <iostream>
#include <memory>
using namespace std;
class A {
public:
int n = 0;
};
class B {
public:
shared_ptr<A> ba;
};
class C {
public:
shared_ptr<A> ca;
shared_ptr<B> cb;
};
int main () {
cout << "Hello\n";
C c;
shared_ptr<A> a(new A);
c.ca = a;
c.cb->ba = a; // MAYBE PROBLEM HERE
return 0;
}
这段代码编译成功,但是当我运行时,它甚至不打印"Hello"。 我是 C++ 和智能指针的新手。请帮我解释一下这里的问题。 提前致谢!
您的代码的可能修复:
#include <iostream>
#include <memory>
using namespace std;
class A {
public:
int n = 0;
};
class B {
public:
shared_ptr<A> ba;
};
class C {
public:
C() {
cb = make_shared<B>();
}
shared_ptr<A> ca;
shared_ptr<B> cb;
};
int main () {
cout << "Hello\n";
C c;
shared_ptr<A> a = make_shared<A>();
c.ca = a;
c.cb->ba = a; // PROBLEM FIXED in constructor
return 0;
}
这是未定义的行为。
您永远不会创建 B 的实例,并且在行 c.cb->ba = a; // MAYBE PROBLEM HERE
上您正在取消引用一个空指针,即 UB。
请注意,共享指针默认构造为 nullptr,而不是拥有类型的默认构造函数。