Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;通过其中一个指针删除对象时,将null设置为所有指针_C++_Smart Pointers - Fatal编程技术网

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

C++ C++;通过其中一个指针删除对象时,将null设置为所有指针,c++,smart-pointers,C++,Smart Pointers,我有一个对象,有很多指针指向它。在不同的地方它可以被删除,但一旦在一个地方它被删除,其他地方应该知道删除。因此,他们应该检查对象是否已被删除,然后删除。是否有智能指针可以执行此任务?std::shared\u ptr和std::weak\u ptr都可以执行此操作 我将让你自己使用谷歌语法,但是基本上,当最后一个SydDypTR超出范围时,SyddY-PTR所保存的对象被删除,并且任何弱PTR都能检测到这个并停止工作。 很久以前,在我玩的一个游戏中,在C++标准引入AutoTypTR之外的智能指

我有一个对象,有很多指针指向它。在不同的地方它可以被删除,但一旦在一个地方它被删除,其他地方应该知道删除。因此,他们应该检查对象是否已被删除,然后删除。是否有智能指针可以执行此任务?

std::shared\u ptr和std::weak\u ptr都可以执行此操作


我将让你自己使用谷歌语法,但是基本上,当最后一个SydDypTR超出范围时,SyddY-PTR所保存的对象被删除,并且任何弱PTR都能检测到这个并停止工作。

很久以前,在我玩的一个游戏中,在C++标准引入AutoTypTR之外的智能指针之前,我们有类似的东西-

NotadPointer
NullONTargetD破坏指针

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

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


然而,在勇敢的新时代(ish)多线程的世界是危险的——清除另一个线程上当前使用的其他指针效果不佳,因此我们放弃了它,转而使用多线程友好的共享对象和朋友。

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

所有者的定义是,对象在保存引用时不能被销毁。在您的系统中,虽然它们同时是所有者和观察者,但这是完全破坏的

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

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


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

查看此页面stion:我不完全确定它的用法,但听起来像是
std::weak_ptr
可能与您相关,这会起到作用。要使用弱ptr,基本上先将其强制转换为共享ptr,如果它被破坏,强制转换将失败。语法冗长得令人恼火,但它确实有效。我通常发现我不需要弱启动经常出现循环依赖——当它们出现时,它们通常反映循环依赖,我尽量避免使用循环依赖。此外,我不希望一个指针具有某些“优势”在另一个上面,比如一个是所有者,其他的是观察者。在我的例子中,所有的指针都是等价的。那么,据我所知,你必须对所有的指针使用共享的ptr。当使用一个共享的ptr时,对于其余的指针,只有弱的ptr…一旦共享的ptr被破坏,这些弱的ptr就会失效HaReord-PtR方法通常是指在没有人使用它们的情况下,对象不会被破坏,这是安全和容易的,但这意味着你没有明确地对对象说“死”。如果你真的需要明确地杀死对象,并且不知道你将使用哪一个指针,那么你也可以考虑有一个“僵尸”。对象上的标志?我不认为智能指针具有完全相同的语义。如果其他人是所有者而不是观察者,那么当他们仍然持有对该对象的引用时,不可能删除该对象。感谢您的解释,但我认为我想要的是弱所有权。当您知道何时何地该对象被删除时,但你也可以是曾经删除的人。这应该是一种新的所有权,对吗?也就是说,所有者彼此了解,彼此信任,这样每个所有者都可以决定是否删除。纳瑞克:不,这不是一种新的所有权。这是一个坏主意,绝对不是所有权。我也需要它来玩游戏,游戏很恶心泰,嗯?