将对象从unique_ptr数组移动到向量

时间:2016-02-02 11:32:55

标签: c++11 stl smart-pointers unique-ptr

首先,我创建一个Foo对象的unique_ptr数组。 然后我将对象移动到矢量,如下面的代码所示。 但是这段代码没有编译。 另一个问题是,因为对象是使用new运算符的数组版本分配的。 如果发生异常并且程序必须在将对象移回unique_ptr数组之前提前终止会发生什么? 在这种情况下,向量vec将使用delete运算符销毁其内容,而不是删除运算符的数组版本? 我们如何解决这类问题?

class Foo
{
public:
  int id;

  Foo(){};
};

int main()
{
  int n = 10;

  std::unique_ptr<Foo []> fooarr(new Foo[n]);

  std::vector<std::unique_ptr<Foo>> vec;

  for( int i=0 ; i<n ; i++ ){
    fooarr[i].id = i;
  }

  for( int i=0 ; i<n ; i++ ){
    vec.push_back( std::move(fooarr[i]) );
  }

  //then move back the Foo objects from vec to fooarr

}

以下是我从编译器中获得的内容。

  

main.cpp:在函数&#39; int main()&#39;:main.cpp:47:错误:否   调用&#39; std :: vector&gt;,std :: allocator&gt;的匹配函数&GT; &GT; ::的push_back(美孚)&#39;   /usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/bits/stl_vector.h:733:   注意:候选人是:void std :: vector&lt; _Tp,_Alloc&gt; :: push_back(const   _Tp&amp;)[with _Tp = std :: unique_ptr&gt;,_ Alloc = std :: allocator&gt; &gt;] /usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/bits/stl_vector.h:746:   注意:void std :: vector&lt; _Tp,_Alloc&gt; :: push_back(_Tp&amp;&amp;)   [与_Tp = std :: unique_ptr&gt;,_ Alloc =   std :: allocator&gt; &GT;]

1 个答案:

答案 0 :(得分:1)

如果你想要std::vector<std::unique_ptr<Foo>>,那么你需要为数组的每个元素动态分配一个新的Foo

for( int i=0 ; i<n ; i++ ){
  vec.push_back( std::make_unique<Foo>(std::move(fooarr[i])) );
}