让我们说我有以下课程:
class BigClass
{
public:
BigClass();
~BigClass();
private:
... // many variables
};
另一堂课:
class SmallClass
{
public:
SmallClass();
~SmallClass();
private:
const BigClass &ref;
};
请注意,我引用了一个名为BigClass
的{{1}}对象。
ref
对象超出范围时会发生什么?它会被删除还是因为BigClass
引用它而保持活着?如果它被删除,那么保持活着的一个好方法是使用ref
而不是引用吗?答案 0 :(得分:3)
这是一个好设计吗?有没有更好的方法呢?
如果确保SmallClass的寿命比BigClass短,那么它就完全没问题了。这种事情经常出现在用作“仿函数”的小类中。
否则使用智能指针:唯一或共享。或弱共享。
当实际的BigClass对象超出范围时会发生什么?
如果SmallClass仍然存在且具有引用,则它现在是无效引用,并且您的程序将具有未定义的行为。那很糟。它可能不会崩溃,但使用引用将写入另一个对象或破坏堆的可用内存跟踪,或覆盖堆栈值,包括可能的函数返回地址。
它会被删除还是因为引用它而保持活着?
这不是Java。它将被删除。如果您需要跟踪引用计数,那么您需要一个共享的智能指针。
如果它被删除,那么保持活着的一个好方法是使用shared_ptr而不是引用吗?
是