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



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

std::shared_ptr和std::weak_ptr 可以做到这一点

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

很久以前,在我开发的一款游戏中,早在C++标准引入auto_ptr之外的智能指针之前,我们就有了类似的东西——NotadPointer<T>NullONTa目标D结束指针。

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

它通过维护一个所有指针实例的链接列表来实现这一点,然后在销毁时遍历该列表,将所有指针作废。在多线程之前,它实际上非常整洁,运行良好[复制/创建成本适中,但实际取消引用没有开销。实例的大小为3个指针[prev/next/ectual value]。

然而,在多线程的勇敢新世界中,它的危险之处在于,将当前在另一个线程上使用的其他指针清零效果不佳,因此我们放弃了它,转而使用类似shared_ptr的东西和对多线程友好的朋友。

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

所有者的定义是,对象在持有引用时不能被销毁。在你的系统中,尽管他们同时是所有者和观察者,但这是完全崩溃的。

在C++所有权模型中,对象A拥有资源B(包括另一个对象),如果并且仅当资源B在A同意之前不能被销毁。否则,它就是一个观察者。一个物体不能是所有者,也不能让其他人在它试图使用的时候破坏它。这不是所有者。此外,观察者不能销毁资源,因为它不是所有者。只有资源所有者才能销毁它。

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

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

相关内容

  • 没有找到相关文章

最新更新