尝试从矢量获取unique_ptr元素后出错

Error after trying to get unique_ptr element from vector

本文关键字:ptr 元素 出错 unique 获取      更新时间:2023-10-16

我读过如何将unique_ptr<T>插入vector<unique_ptr<T>>:为什么我不能将unique_ptr push_back到向量中?

但是如何取回元素呢?我举了一个例子:

#include <memory>
#include <vector>
class A {
  public:
    A(int x, int y){
      x_ = x;
      y_ = y;
    }
  private:
    int x_;
    int y_;
};

int main(){
  std::vector<std::unique_ptr<A>> vec_a;
  std::unique_ptr<A> tmp_a = std::unique_ptr<A>(new A(13,32));
  vec_a.push_back(std::move(tmp_a));
  vec_a.push_back(std::unique_ptr<A>(new A(3,2)));
  // error
  std::unique_ptr<A> a = vec_a.at(0);
}

我收到此错误消息:

main.cc: In function ‘int main()’:
main.cc:24:36: error: use of deleted function 
      ‘std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&) 
      [with _Tp = A; _Dp = std::default_delete<A>]’
   std::unique_ptr<A> a = vec_a.at(0);
                                    ^
In file included from /usr/include/c++/4.8/memory:81:0,
                 from main.cc:1:
/usr/include/c++/4.8/bits/unique_ptr.h:273:7: error: declared here
       unique_ptr(const unique_ptr&) = delete;
       ^

我做错了什么?我应该怎么做?为什么这不起作用?

unique_ptr无法

复制或分配。它需要移动复制或移动分配。您可以通过使用std::move来实现这一点:

std::unique_ptr<A> a = std::move(vec_a.at(0));

std::move的调用本质上允许您将 RHS 视为右值,然后可以在unique_ptr'移动复制构造函数

'中使用。

请注意,在此之后,您必须小心vec_a的第一个元素。

如果不想将指针的所有权从矢量中夺走,只需直接访问托管指针:

A* a = vec_a.at(0).get();

您必须小心不要在它指向的对象不复存在后使用它a

这是一个

unique_ptr,你正在尝试制作副本。 一种解决方法是获取原始指针:

A* a = vec_a.at(0).get();

请记住,向量仍将拥有指针,并且当向量超出范围时仍会删除它。