如果我没有尝试管理我指向的对象的内存,我应该使用unique_ptr吗?

时间:2017-12-01 02:43:27

标签: c++ vector smart-pointers unique-ptr

我有三个班级:A,B,C

在A类中,有一个vector<vector<B>>

在C类中有一个vector<unique_ptr<B>> C向量中的ptrs只是指向A类中2d向量的元素。

我只想要引用这些元素,并且我不想用这些指针创建新的内存(不确定这是不是unique_ptrs正在做的事情)。

在这种情况下,使用原始指针会更好吗?

编辑:当删除矢量时(当ptrs超出范围时),我不希望删除我指向的对象

2 个答案:

答案 0 :(得分:1)

你不能(除非你喜欢腐败所有的事情,否则不应该使用unique_ptr来引用未通过new分配的对象(或隐含地通过{{1 }})。

除非在初始化std::make_unique之前完全初始化A的2D vector,否则使用原始指针并不是特别好的主意。之后永远不要调整它;调整大小会使指针无效,如果您尝试从中读取它们,则会导致未定义的行为。

我推荐2个选项中的1个,具体取决于您的方案中最有效的选项:

  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

  2. 中的引用
  3. 如果C指向C中的逻辑索引(其中更改A&#39; s A中的值应改变所看到的内容vector),将C更改为:

    一个。对C A(或vector本身)

    的引用

    湾一个A,其中每个vector<std::pair<size_t, size_t>>定义用于在pair A中查找关联值的索引。

  4. 选项2意味着vector不必更改,如果有的话(除了确保A可以看到其C);基于vector剩余值,因此使用其中的值仅保留两个随机访问间接,而不是使用vector时所需的3-4(shared_ptr意味着它有效3 ,手动调用std::make_sharednew为4)。

答案 1 :(得分:0)

B对象由A中的向量管理的生命周期。这意味着不需要在它们周围包裹unique_ptr。实际上,如果您的unique_ptr未使用no-op删除器创建,则会出错;在这种情况下,他们将删除对象,然后向量将再次删除它们。

由于C只需要观察对象,因此可以使用原始指针。非拥有的原始指针(意味着你永远不会称之为delete的指针)很好。

但是,这种长期的原始指针很难推理。指向的对象是否仍然有效?你怎么知道的?您可能希望向A添加API,以提供对对象的访问权限,并且仅在需要时在C中访问它们,而不存储任何指针。