我有一个由三个类组成的基本设计:一个Data类,一个持有和管理多个Data对象的Holder类,以及一个包含对Data对象的引用的Holder返回的Wrapper。
问题是Wrapper不能超过Holder,否则它将包含悬空引用,因为Holder负责删除Data对象。但是由于Wrapper 意图具有非常短的生命周期(在函数中获取它,对其数据进行一些计算,并让它超出范围),这个应该不是问题,但我不确定这是一个好的设计。
以下是我想到的一些解决方案:
- 依据用户阅读文档,技术上与STL迭代器相同的事情发生了
- 使用shared_ptr确保数据持续很长时间,但感觉就像是矫枉过正
-Make Wrapper每次使用时验证其持有人是否仍然存在
- 任何想法?
(我希望每个人都能理解这一点,因为英语不是我的母语)
编辑:如果你想要一个较少的理论方法,这一切都来自一个小算法,我试图写解决Sudokus,持有人是网格,数据是每个框的内容(结果或临时假设),Wrapper是一个Box类,它包含对数据的引用,以及行和列等附加信息。 我最初没有这么说,因为我想知道在更一般的情况下该怎么做。
答案 0 :(得分:0)
详细说明您已列为选项的内容,
如您所知,shared_ptr<Data>
是个不错的选择。除非性能是一个问题,否则你应该使用它。
永远不要在Data
中指向Wrapper
。存储一个句柄,可用于获取指向相应Data
对象的指针。在通过Data
访问Wrapper
之前,获取Data
对象的指针。如果指针无效,则抛出exception
。如果指针有效,请沿着快乐路径前进。
答案 1 :(得分:0)
只有按值返回Wrapper
才有助于确保来电者不会超出调用范围。与评论或文档相结合,&#34; Wrappers仅在创建它们的持有者的生命周期内有效。应该够了。
或者您决定Data
的所有权在创建Wrapper
时转移到Wrapper
,Data
与{Wrapper
一起销毁1}} - 但是如果你想在没有删除Wrapper
的情况下销毁Data
怎么办?您需要一种方法来有选择地将Data
的所有权放回Holder
。
无论你选择哪一种,你都需要决定拥有什么(即:负责生命周期)Data
以及何时 - 一旦你已经做到了,你可以,如果你想要,使用智能指针来帮助管理 - 但是他们不会为你做出设计决定,你不能简单地说'#34;哦,我会使用智能指针而不是思考它&#34;。
请记住,如果您无法管理堆内存而没有智能指针 - 您也无法管理堆内存 它们的业务!