我正在编写一个名为Bar的类,Bar需要访问另一个类Foo才能发挥作用。因此,Bar使用它的实例必须比Foo的实例更长寿。
我不能确定两种写法之间的区别。以下是示例:
#include <iostream>
#include <memory>
using namespace std;
struct Foo {
Foo(int _x) : x_(_x) {}
~Foo() {}
int x_;
};
struct Bar1 {
Bar1(Foo& _foo) : foo_(_foo) {}
void print_foo() {cout << foo_.x_ << endl;}
private:
Foo& foo_;
};
struct Bar2 {
Bar2(shared_ptr<Foo> _foo) : foo_{move(_foo)} {}
void print_foo() {cout << foo_->x_ << std::endl;}
private:
shared_ptr<Foo> foo_;
};
int main()
{
Foo f1{1};
shared_ptr<Foo> f2 = make_shared<Foo>(2);
Bar1 b1(f1);
b1.print_foo();
Bar2 b2(f2);
b2.print_foo();
return 0;
}
我认为Bar1可以让用户更自由地管理Foo的生命周期,并且可能更有效率。但是当foo_所指向的Foo实例被销毁时,它会进入一个未定义的状态(不确定这里是否用词正确)。
如何处理这种情况以及为什么要采取首选方式?