当通过其中一个删除对象时,C++ 将所有指针设置为 null

C++ set null to all pointers when deleting an object via one of them

我有一个对象,并且有很多指向它的指针。在不同的地方可以删除,但是一旦在一个地方删除,其他地方应该知道删除。所以他们应该检查对象是否还没有被删除,然后删除。有智能指针可以完成这项工作吗?

std::shared_ptr 可以做到这一点,还有 std::weak_ptr

我会让你自己 google 语法,但基本上,当最后一个 shared_ptr 超出范围时, shared_ptr 持有的对象将被删除,并且任何弱点它能够检测到这一点并停止工作。

很久以前,在我开发的一款游戏中,在 C++ 标准引入 auto_ptr 之外的智能指针之前,我们有类似的东西 - NotadPointer<T>Null On Target Destruction 指针。

它是一种智能指针,当对象被删除时,它会自动清除指向该对象的任何其他指针。

它通过维护一个所有指针实例的链表,然后在销毁时遍历这个列表来消除所有这些实例来做到这一点。 Pre-multithreading 它实际上非常整洁并且运行良好 [相对于 copy/create 来说有点贵,但没有实际取消引用的开销。一个实例的大小是 3 个指针 [prev/next/actual 值].

然而,在勇敢的新(ish)多线程世界中它的危险 - 清空当前在另一个线程上使用的其他指针效果不佳,所以我们放弃了它 shared_ptr 之类的东西和多线程友好的朋友。

鉴于您的评论,我倾向于认为您的所有权概念是错误的。

所有者的定义是对象在持有引用时不能被销毁。在你的系统中,虽然他们同时都是所有者和观察者,但这是完全错误的。

在 C++ 所有权模型中,对象 A 拥有资源 B(包括另一个对象),前提是 且仅当 资源 B 在 A 同意之前不能销毁。否则,它是一个观察者。一个对象不能是所有者,也不能在它仍在尝试使用它时让其他人销毁该对象。那不是所有者。此外,观察者不能销毁资源,因为它不是所有者。只有资源的所有者才能销毁它。

对象不能同时是所有者和观察者(同一资源)。这完全没有意义。

如果您想共享所有权,请使用 shared_ptr,它将为您适当地处理删除对象。如果要观察是否被删除,使用weak_ptr。在任何情况下都不要删除该对象,除非 shared_ptr 自动清理它。