C++ std::array 到 shared_ptr 的向量
Posted
技术标签:
【中文标题】C++ std::array 到 shared_ptr 的向量【英文标题】:C++ std::array to vector of shared_ptr 【发布时间】:2017-04-14 15:22:03 【问题描述】:最惯用的转换方式是什么?
std::array<SomeType,SIZE> arr;
std::vector<shared_ptr<SomeType>> vec; // <--- want to fill with pointers
// to items in arr
第二个问题 - 是否可以为 stack-allocated array
中的对象创建 shared_ptr
?一旦vec
被销毁,指针目标会被“释放”吗?
编辑
我需要这样的东西
class Element
Element *next;
class Group
std::vector<Element*> elems;
int main()
...
std::array<Element,10> elems = ...;
std::array<Group,4> groups = ...;
// shuffle elems and assign to groups; set next-pointers in elems:
// group1: &elem10
// group2: &elem8 &elem5
// group3: &elem2 &elem7 &elem3
// group4: &elem4 &elem9 &elem1 &elem6
// at some point:
// save or load all elems and groups,
// preserving pointers elem->elem, group->elem
【问题讨论】:
你想要的是一个非拥有的指针,即。原始指针或 std::reference_wrapper @boofazshared_ptr
不关心对象是如何分配的,它只知道当引用计数变为零时必须调用删除器。使用默认删除器,您将收到对delete
(或delete[]
)的调用,但由于您将指向局部变量,这将崩溃。你想在这里释放什么?也许展示一个更完整的例子......
你的实际用例是什么?
拥有原始指针通常被认为是坏的。由于 std::array 不管理动态内存所有权,因此首先不必担心。
@boofaz 告诉我们你想用谷物做什么,如果我们能看到全貌,会更容易提供帮助。
【参考方案1】:
如果您想要一个对象的shared_ptr
,那么您应该确保该对象确实由shared_ptr
管理。用它玩游戏是危险的,并可能导致不确定的行为。在您的情况下,诀窍是使用shared_ptr
管理阵列本身。这样您就可以将有效的shared_ptr
检索到它的任何元素。
auto elems = std::make_shared<std::array<Element,10>>();
然后您可以使用shared_ptr
的别名构造函数为各个元素创建shared_ptrs
。如果您想将这些 shared_ptrs
粘贴在 vector
中,您可以执行以下操作:
std::vector<std::shared_ptr<Element>> v;
v.reserve(elems->size());
std::transform(
elems->begin(),
elems->end(),
std::back_inserter(v),
[&elems] (Element& e) return std::shared_ptr<Element> elems, &e ; );
请注意,这样做的一个(可能是意外的)后果是,只要您的其中一个成员拥有shared_ptr
,您的整个元素数组就会继续存在。
【讨论】:
正确答案,但操作人员不太可能知道原因。 +1以上是关于C++ std::array 到 shared_ptr 的向量的主要内容,如果未能解决你的问题,请参考以下文章
c++ 数组与 std::vector 和 std::array 的效率
在现代 C++ 中将 std::array<std::array<T,N>> 转换为 std::vector<T>