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



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

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: 在函数 'int main((' 中: main.cpp:47: error: no 用于调用 'std::vector>, std::分配器>>>::p ush_back(Foo(' 的匹配函数 /usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/bits/stl_vector.h:733: 注意:候选者是:void std::vector<_Tp,_Alloc>::p ush_back(const _Tp&( [_Tp = std::unique_ptr>, _Alloc = std::allocator>>]/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/bits/stl_vector.h:746: 注意:void std::vector<_Tp, _Alloc>::p ush_back(_Tp&&( [_Tp = 标准::unique_ptr>,_Alloc = 标准::分配器>>]

>如果你想要一个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])) );
}

正如另一个答案所说,如果你想把Foo放进vec,你应该调用make_unique<Foo>(std::move(fooarr[i])),如果你想把它们放回去,你需要 release((

Below is the complete implementation   
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(make_unique<Foo>(std::move(fooarr[i])));  
  //then move back the Foo objects from vec to fooarr
  for (int i = 0; i < n; ++i) {
    fooarr[i] = *vec[i].release();
    assert(vec[i] == nullptr);  
  }
}

相关内容

  • 没有找到相关文章

最新更新