C++ C++;std::数组到共享\u ptr的向量

C++ C++;std::数组到共享\u ptr的向量,c++,pointers,containers,shared-ptr,smart-pointers,C++,Pointers,Containers,Shared Ptr,Smart Pointers,最惯用的转换方式是什么 std::array<SomeType,SIZE> arr; std::vector<shared_ptr<SomeType>> vec; // <--- want to fill with pointers // to items in arr 如果希望对象具有shared\u ptr,则应确保该对象确实由shared\u ptr管理

最惯用的转换方式是什么

std::array<SomeType,SIZE> arr;

std::vector<shared_ptr<SomeType>> vec;  // <--- want to fill with pointers
                                        //      to items in arr

如果希望对象具有
shared\u ptr
,则应确保该对象确实由
shared\u ptr
管理。玩这种游戏是危险的,可能会导致未定义的行为。在您的例子中,诀窍是使用
共享\u ptr
管理阵列本身。这将允许您检索有效的
共享的\u ptr
到其任何元素

auto elems = std::make_shared<std::array<Element,10>>();

请注意,这样做的一个(可能是无意的)后果是,只要您有一个
共享的\u ptr
给它的一个成员,整个元素数组就会继续存在。

您想要的是一个非拥有指针,即原始指针或std::引用_wrapper@boofaz
shared\u ptr
不关心对象是如何分配的,它只知道当refcount变为零时必须调用deleter。使用默认的deleter,您将得到一个对
delete
(或
delete[]
)的调用,但由于您将指向局部变量,这将崩溃。你想在这里免费得到什么?也许展示一个更完整的例子…你的实际用例是什么?拥有原始指针通常被认为是不好的。由于std::array不管理动态内存所有权,这一点一开始就不值得关注。@boofaz向我们展示了你想用谷物做什么,如果我们能看到整个画面,会更容易提供帮助。回答正确,但op不太可能知道原因+1.
auto elems = std::make_shared<std::array<Element,10>>();
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 }; });