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 @boofaz shared_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>

std::array 中使用的 C++ 11 中的全局常量

C++ STL应用与实现5: 如何使用std::array (since C++11)

C++ 静态多数组包装器

数组的 C++ 向量