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

时间:2015-04-29 10:34:02

标签: c++ smart-pointers

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

3 个答案:

答案 0 :(得分:6)

std :: shared_ptr可以和std :: weak_ptr

一起执行此操作

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

答案 1 :(得分:1)

很久以前,在我参与的游戏中,在C ++标准引入auto_ptr之外的智能指针之前,我们有类似的东西 - NotadPointer<T> N ull O n Ta rget D estruction指针。

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

它通过维护指针的所有实例的链接列表,然后在销毁时将此列表移除,将所有指针置零,从而完成此操作。预多线程它实际上非常整洁并且运行良好[复制/创建中等昂贵但实际取消引用没有开销。实例的大小是3个指针[prev / next / actual value]。

然而,在勇敢的新的(ish)多线程世界中,它是危险的 - 将其他指针放在另一个线程上当前正在使用它并不能很好地工作,所以我们放弃了它为shared_ptr,就像物和朋友一样多线程友好。

答案 2 :(得分:1)

鉴于您的意见,我倾向于相信您的所有权概念是错误的。

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

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

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

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