尝试从矢量获取unique_ptr元素后出错
Error after trying to get unique_ptr element from vector
我读过如何将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();
请记住,向量仍将拥有指针,并且当向量超出范围时仍会删除它。
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 使用strcpy将char数组的元素复制到另一个数组
- 使用不带参数的函数访问结构元素
- 给定n个元素的m个集合.在C++中找到出现在最大集合数中的元素
- C++如何通过用户输入删除列表元素
- lower_bound()返回最后一个元素
- 基于多个条件处理地图中的所有元素
- 调整大小后指向元素值的指针unordered_map有效?
- 使用std::transform将一个范围的元素添加到另一个范围中
- 使用函数"remove"删除重复元素
- 具有最大子序列大小的序列,每个元素都相同
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 如何将元素添加到数组的线程安全函数?
- 有没有办法将谓词中的元素偏移量传递给 std 算法?
- 我想访问std::unique_ptr中的一个特定元素
- 如何通过 getter 函数删除矢量的元素?
- 如何从集合中删除共享的 PTR 元素
- Linux中的c++运行时错误::glibc检测到free():无效的下一个大小(快速):堆栈具有void ptr元素
- 如何使用c++ Mat类ptr对象的基本C包装器打印Mat元素?