【问题标题】:C++ std::array to vector of shared_ptrC++ std::array 到 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 告诉我们你想用谷物做什么,如果我们能看到全貌,会更容易提供帮助。

标签: c++ pointers containers shared-ptr smart-pointers


【解决方案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
猜你喜欢
  • 2014-09-08
  • 1970-01-01
  • 2011-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-24
  • 2013-09-07
  • 2011-09-27
相关资源
最近更新 更多