如果我们有一个父类引用子类(共享指针),并且子类也引用父类(再次使用共享指针),我们必须使这两个智能指针中的一个成为弱指针。
但是我们如何确定这两个指针中的哪一个应该是弱指针呢?
同样,当弱指针指向 0 时(当共享计数为 0 时),当我们可能仍然需要访问它时,不是删除对象的情况吗? 好的,我知道至少我们知道该对象不存在,我们不应该尝试访问它,但这足够了吗?
想想对象的liftime。
如果子项不能超过父项的寿命,则父项持有指向子项的共享指针。
共享指针定义生存期层次结构。
如果我们有一个父类,它引用了一个子类 (共享指针)和子类也引用了 父类(再次使用共享指针)我们必须创建一个 这两个智能指针是一个弱指针。
不,您不必这样做,如果您认为它适合您的设计,则可以。
但是我们如何决定这两个指针中的哪一个应该是弱的 指针?
可以在不需要另一个的情况下生存和完成工作的对象应该存储弱指针
此外,当弱指针指向 0 时(当共享计数为 0 时),是 不是在我们可能仍然需要访问时删除对象的情况 到它?好的,我知道至少我们知道该对象不存在 并且我们不应该尝试访问它,但这足够了吗?
如果两个对象在自己处于活动状态时都需要彼此处于活动状态,则在每个对象中保留一个共享指针。当这些对象完成其工作时,您只需重置一个共享指针(通常是包含在最顶级类中的指针),它将创建一个清理周期,如果它们未在其他地方使用,则所有实例都将被正确销毁。
PS:我发现在这种情况下非常有帮助的设计是添加start
/stop
成员函数,特别是如果您使用的是无法在构造函数中调用的enable_shared_from_this
,您可以从boost asio的作者那里获得有关此设计的更多详细信息。