首先,我创建一个 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);
}
}