我有三个班级:A,B,C
在A类中,有一个vector<vector<B>>
在C类中有一个vector<unique_ptr<B>>
C向量中的ptrs只是指向A类中2d向量的元素。
我只想要引用这些元素,并且我不想用这些指针创建新的内存(不确定这是不是unique_ptrs正在做的事情)。
在这种情况下,使用原始指针会更好吗?
编辑:当删除矢量时(当ptrs超出范围时),我不希望删除我指向的对象
答案 0 :(得分:1)
你不能(除非你喜欢腐败所有的事情,否则不应该使用unique_ptr
来引用未通过new
分配的对象(或隐含地通过{{1 }})。
除非在初始化std::make_unique
之前完全初始化A
的2D vector
,否则使用原始指针并不是特别好的主意。之后永远不要调整它;调整大小会使指针无效,如果您尝试从中读取它们,则会导致未定义的行为。
我推荐2个选项中的1个,具体取决于您的方案中最有效的选项:
在C
中使用vector<vector<std::shared_ptr<B>>>
(使用A
分配的类型填充它)并使std::make_shared
&#39; s C
vector
(如果从vector<std::shared_ptr<B>>
删除不应影响A
并且不涉及参考周期)或C
(如果从vector<std::weak_ptr<B>>
删除则应删除A
)
如果C
指向C
中的逻辑索引(其中更改A
&#39; s A
中的值应改变所看到的内容vector
),将C
更改为:
一个。对C
A
(或vector
本身)
湾一个A
,其中每个vector<std::pair<size_t, size_t>>
定义用于在pair
A
中查找关联值的索引。
选项2意味着vector
不必更改,如果有的话(除了确保A
可以看到其C
);基于vector
剩余值,因此使用其中的值仅保留两个随机访问间接,而不是使用vector
时所需的3-4(shared_ptr
意味着它有效3 ,手动调用std::make_shared
和new
为4)。
答案 1 :(得分:0)
B
对象由A
中的向量管理的生命周期。这意味着不需要在它们周围包裹unique_ptr
。实际上,如果您的unique_ptr
未使用no-op删除器创建,则会出错;在这种情况下,他们将删除对象,然后向量将再次删除它们。
由于C
只需要观察对象,因此可以使用原始指针。非拥有的原始指针(意味着你永远不会称之为delete
的指针)很好。
但是,这种长期的原始指针很难推理。指向的对象是否仍然有效?你怎么知道的?您可能希望向A
添加API,以提供对对象的访问权限,并且仅在需要时在C
中访问它们,而不存储任何指针。