如果我不想管理我指向的对象的内存,我应该使用 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 个,具体取决于哪种方案最适合您的情况:
在A
中使用vector<vector<std::shared_ptr<B>>>
(用通过std::make_shared
分配的类型填充它)并使C
的vector
vector<std::shared_ptr<B>>
(如果从 A
中删除应该不会影响 C
并且不涉及引用循环)或 vector<std::weak_ptr<B>>
(如果从 A
中删除应该删除C
)
中的参考
如果 C
指向 A
中的逻辑索引(其中更改 A
的 vector
中的值应该会改变所看到的内容通过 C
),将 C
更改为保持:
一个。引用 A
的 vector
(或 A
本身)
b。 vector<std::pair<size_t, size_t>>
,其中每个 pair
定义用于在 A
的 vector
.
中查找关联值的索引
选项 2 意味着 A
不需要改变太多,如果有的话(除了确保 C
可以看到它的 vector
); vector
仍然是基于值的,所以在其中使用一个值仍然只有两个随机访问间接,而不是使用 shared_ptr
时所需的 3-4(std::make_shared
意味着它实际上是 3,手动调用new
和 std::shared_ptr
是 4).
B
个对象由 A
中的向量管理时的生命周期。这意味着不需要用 unique_ptr
包裹它们。事实上,如果您的 unique_ptr
不是使用空操作删除器创建的,那将是一个错误;在这种情况下,他们将删除对象,然后向量将再次删除它们。
由于C
只需要观察对象,可以使用原始指针。不拥有原始指针(意思是你从不调用 delete
的指针)没问题。
然而,这种长期的原始指针很难推理。指向的对象是否仍然有效?你怎么知道的?您可能想要向 A
添加一个 API 以提供对对象的访问,并且仅在需要时在 C
中访问它们,而不存储任何指向它们的指针。
我有三个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 个,具体取决于哪种方案最适合您的情况:
在
A
中使用vector<vector<std::shared_ptr<B>>>
(用通过std::make_shared
分配的类型填充它)并使C
的vector
vector<std::shared_ptr<B>>
(如果从A
中删除应该不会影响C
并且不涉及引用循环)或vector<std::weak_ptr<B>>
(如果从A
中删除应该删除C
) 中的参考
如果
C
指向A
中的逻辑索引(其中更改A
的vector
中的值应该会改变所看到的内容通过C
),将C
更改为保持:一个。引用
A
的vector
(或A
本身)b。
vector<std::pair<size_t, size_t>>
,其中每个pair
定义用于在A
的vector
. 中查找关联值的索引
选项 2 意味着 A
不需要改变太多,如果有的话(除了确保 C
可以看到它的 vector
); vector
仍然是基于值的,所以在其中使用一个值仍然只有两个随机访问间接,而不是使用 shared_ptr
时所需的 3-4(std::make_shared
意味着它实际上是 3,手动调用new
和 std::shared_ptr
是 4).
B
个对象由 A
中的向量管理时的生命周期。这意味着不需要用 unique_ptr
包裹它们。事实上,如果您的 unique_ptr
不是使用空操作删除器创建的,那将是一个错误;在这种情况下,他们将删除对象,然后向量将再次删除它们。
由于C
只需要观察对象,可以使用原始指针。不拥有原始指针(意思是你从不调用 delete
的指针)没问题。
然而,这种长期的原始指针很难推理。指向的对象是否仍然有效?你怎么知道的?您可能想要向 A
添加一个 API 以提供对对象的访问,并且仅在需要时在 C
中访问它们,而不存储任何指向它们的指针。