如果我不想管理我指向的对象的内存,我应该使用 unique_ptr 吗?

Should I be using unique_ptr if I'm not trying to manage the memory of the object I'm pointing at?

我有三个class:A、B、C

在class中有一个vector<vector<B>>

in class C 有一个 vector<unique_ptr<B>> C 向量中的 ptrs 简单地指向 class A 中的 2d 向量的元素。

我只想引用这些元素,不想用这些指针创建新内存(不确定 unique_ptrs 是否正在这样做)。

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

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

你不能(好吧,除非你喜欢破坏所有东西,否则不应该)使用 unique_ptr 来引用未通过 new 分配的对象(或通过 std::make_unique 隐式分配的对象) ).

使用原始指针也不是一个特别好的主意,除非你在初始化 C 之前完全初始化 A 的 2D vector,然后再不调整它的大小;调整大小会使您的指针无效,如果您尝试从中读取,则会导致未定义的行为。

我会推荐 2 个选项中的 1 个,具体取决于哪种方案最适合您的情况:

  1. A中使用vector<vector<std::shared_ptr<B>>>(用通过std::make_shared分配的类型填充它)并使Cvector vector<std::shared_ptr<B>>(如果从 A 中删除应该不会影响 C 并且不涉及引用循环)或 vector<std::weak_ptr<B>>(如果从 A 中删除应该删除C)

  2. 中的参考
  3. 如果 C 指向 A 中的逻辑索引(其中更改 Avector 中的值应该会改变所看到的内容通过 C),将 C 更改为保持:

    一个。引用 Avector(或 A 本身)

    b。 vector<std::pair<size_t, size_t>>,其中每个 pair 定义用于在 Avector.

  4. 中查找关联值的索引

选项 2 意味着 A 不需要改变太多,如果有的话(除了确保 C 可以看到它的 vector); vector 仍然是基于值的,所以在其中使用一个值仍然只有两个随机访问间接,而不是使用 shared_ptr 时所需的 3-4(std::make_shared 意味着它实际上是 3,手动调用newstd::shared_ptr 是 4).

B 个对象由 A 中的向量管理时的生命周期。这意味着不需要用 unique_ptr 包裹它们。事实上,如果您的 unique_ptr 不是使用空操作删除器创建的,那将是一个错误;在这种情况下,他们将删除对象,然后向量将再次删除它们。

由于C只需要观察对象,可以使用原始指针。不拥有原始指针(意思是你从不调用 delete 的指针)没问题。

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