为了账号安全,请及时绑定邮箱和手机立即绑定

为什么我不能将唯一的PTR推回向量?

为什么我不能将唯一的PTR推回向量?

C++
一只萌萌小番薯 2019-07-05 13:31:25
为什么我不能将唯一的PTR推回向量?这个程序有什么问题?#include <memory>#include <vector>int main(){     std::vector<std::unique_ptr<int>> vec;     int x(1);     std::unique_ptr<int> ptr2x(&x);     vec.push_back(ptr2x); //This tiny command has a vicious error.     return 0;}错误:In file included from c:\mingw\bin\../lib/gcc/mingw32/4.5.0/include/c++/mingw32/bits/c++allocator.h:34:0,                 from c:\mingw\bin\../lib/gcc/mingw32/4.5.0/include/c++/bits/allocator.h:48,                 from c:\mingw\bin\../lib/gcc/mingw32/4.5.0/include/c++/memory:64,                 from main.cpp:6:c:\mingw\bin\../lib/gcc/mingw32/4.5.0/include/c++/bits/unique_ptr.h: In member function 'void __gnu_cxx::new_allocator<_Tp>::construct(_Tp*, const _Tp&) [with _Tp = std::unique_ptr<int>, _Tp* = std::unique_ptr<int>*]':c:\mingw\bin\../lib/gcc/mingw32/4.5.0/include/c++/bits/stl_vector.h:745:6:   instantiated from 'void std::vector<_Tp, _Alloc>::push_back(const value_type&) [with _Tp = std::unique_ptr<int>, _Alloc = std::allocator<std::unique_ptr<int> >, value_type = std::unique_ptr<int>]'main.cpp:16:21:   instantiated from herec:\mingw\bin\../lib/gcc/mingw32/4.5.0/include/c++/bits/unique_ptr.h:207:7: error: deleted function 'std::unique_ptr<_Tp, _Tp_Deleter>::unique_ptr(const std::unique_ptr<_Tp, _Tp_Deleter>&) [with _Tp = int, _Tp_Deleter = std::default_delete<int>, std::unique_ptr<_Tp, _Tp_Deleter> = std::unique_ptr<int>]'c:\mingw\bin\../lib/gcc/mingw32/4.5.0/include/c++/ext/new_allocator.h:105:9: error: used hereIn file included from c:\mingw\bin\../lib/gcc/mingw32/4.5.0/include/c++/vector:69:0,                 from main.cpp:7:
查看完整描述

2 回答

?
慕标5832272

TA贡献1966条经验 获得超4个赞

你需要移动unique_ptr:

vec.push_back(std::move(ptr2x));

unique_ptr保证unique_ptr容器拥有持有指针的所有权。这意味着您不能复制unique_ptr(因为那时有两个unique_ptr我们有所有权),所以你只能移动它。

但是,请注意,您当前使用的unique_ptr是不正确的。不能使用它来管理指向局部变量的指针。局部变量的生存期是自动管理的:局部变量在块结束时被销毁(例如,当函数返回时,在本例中)。您需要动态分配对象:

std::unique_ptr<int> ptr(new int(1));


查看完整回答
反对 回复 2019-07-05
?
牛魔王的故事

TA贡献1830条经验 获得超3个赞

STD:UNIQUE_PTR没有复制构造函数。创建一个实例,然后询问STD:向量若要在初始化期间复制该实例,请执行以下操作。

error: deleted function 'std::unique_ptr<_Tp, _Tp_Deleter>::uniqu
e_ptr(const std::unique_ptr<_Tp, _Tp_Deleter>&) [with _Tp = int, _Tp_D
eleter = std::default_delete<int>, std::unique_ptr<_Tp, _Tp_Deleter> =
 std::unique_ptr<int>]'

类满足MoveConstrucable和MoveAssignable的要求,但不满足CopyConstrucable或CopyAssignable的要求。

以下内容与新的座落打电话。

std::vector< std::unique_ptr< int > > vec;vec.emplace_back( new int( 1984 ) );

看见在标准库容器中使用UNIQUE_PTR进一步阅读。


查看完整回答
反对 回复 2019-07-05
  • 2 回答
  • 0 关注
  • 355 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信