unique_ptr 尝试引用已删除的函数

十八道胡同 2019-01-25 10:23:13
我使用unique_ptr,来自动释放内存空间,代码修改完之后,报如下错误:

错误 2 error C2280: “std::unique_ptr<SplitResult,std::default_delete<_Ty>>::unique_ptr(const std::unique_ptr<_Ty,std::default_delete<_Ty>> &)”:
尝试引用已删除的函数 C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\xmemory0 593 1 GuiZ.CPrice_CPlusPlus


可能的原因是:某unique_ptr在被调用了std::move之后再次被使用?
有啥更好的办法来让C++自己释放内存吗?
...全文
1716 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
十八道胡同 2019-01-28
  • 打赏
  • 举报
回复
引用 9 楼 lianshaohua 的回复:
[quote=引用 8 楼 LCL_data 的回复:] [quote=引用 7 楼 lianshaohua 的回复:] [quote=引用 6 楼 LCL_data 的回复:] [quote=引用 5 楼 lianshaohua 的回复:] 都用了smart_ptr了,还有必要使用std::move吗?
我目前只是用到了STL里面的库,BOOST里面的库没用。[/quote] 和boost没有关系吧?[/quote] STL里面里面的智能指针 不是只有unique_ptr、shared_ptr,weak_ptr吗? 你说的smart_ptr 不是在boost里面吗? 是我理解错了?[/quote] smart_ptr是智能指针的意思[/quote] 哦哦。谢谢回复。
ztenv 版主 2019-01-28
  • 打赏
  • 举报
回复
引用 8 楼 LCL_data 的回复:
[quote=引用 7 楼 lianshaohua 的回复:]
[quote=引用 6 楼 LCL_data 的回复:]
[quote=引用 5 楼 lianshaohua 的回复:]
都用了smart_ptr了,还有必要使用std::move吗?


我目前只是用到了STL里面的库,BOOST里面的库没用。[/quote]
和boost没有关系吧?[/quote]

STL里面里面的智能指针 不是只有unique_ptr、shared_ptr,weak_ptr吗?
你说的smart_ptr 不是在boost里面吗?
是我理解错了?[/quote]
smart_ptr是智能指针的意思
十八道胡同 2019-01-28
  • 打赏
  • 举报
回复
引用 7 楼 lianshaohua 的回复:
[quote=引用 6 楼 LCL_data 的回复:] [quote=引用 5 楼 lianshaohua 的回复:] 都用了smart_ptr了,还有必要使用std::move吗?
我目前只是用到了STL里面的库,BOOST里面的库没用。[/quote] 和boost没有关系吧?[/quote] STL里面里面的智能指针 不是只有unique_ptr、shared_ptr,weak_ptr吗? 你说的smart_ptr 不是在boost里面吗? 是我理解错了?
ztenv 版主 2019-01-28
  • 打赏
  • 举报
回复
引用 6 楼 LCL_data 的回复:
[quote=引用 5 楼 lianshaohua 的回复:]
都用了smart_ptr了,还有必要使用std::move吗?


我目前只是用到了STL里面的库,BOOST里面的库没用。[/quote]
和boost没有关系吧?
独孤过 2019-01-28
  • 打赏
  • 举报
回复
左值std::unique_ptr,在移动时,需要使用std::move,右值不用
ztenv 版主 2019-01-28
  • 打赏
  • 举报
回复
引用 10 楼 LCL_data 的回复:
[quote=引用 9 楼 lianshaohua 的回复:]
[quote=引用 8 楼 LCL_data 的回复:]
[quote=引用 7 楼 lianshaohua 的回复:]
[quote=引用 6 楼 LCL_data 的回复:]
[quote=引用 5 楼 lianshaohua 的回复:]
都用了smart_ptr了,还有必要使用std::move吗?


我目前只是用到了STL里面的库,BOOST里面的库没用。[/quote]
和boost没有关系吧?[/quote]

STL里面里面的智能指针 不是只有unique_ptr、shared_ptr,weak_ptr吗?
你说的smart_ptr 不是在boost里面吗?
是我理解错了?[/quote]
smart_ptr是智能指针的意思[/quote]
哦哦。谢谢回复。[/quote]
不客气,用了智能指针就没有必要再用std::move了,或换一种说明:代码违返了std::move的语义了(确定在当前函数不再使用的对象才能std::move)
十八道胡同 2019-01-27
  • 打赏
  • 举报
回复
引用 5 楼 lianshaohua 的回复:
都用了smart_ptr了,还有必要使用std::move吗?
我目前只是用到了STL里面的库,BOOST里面的库没用。
sdghchj 2019-01-25
  • 打赏
  • 举报
回复
错误描述已经很清楚了还跑来问 你代码中调用了unique_ptr的const左值引用传参的拷贝构造函数,就是std::unique_ptr<T>::unique_ptr(<const std::unique_ptr<T>&>),这个函数是被标准为delete的。 并不是你std::unique_ptr<SplitResult> now = std::move(pre);有错,而代码中有std::unique_ptr<SplitResult> now(pre);这种类似错误使用的。
独孤过 2019-01-25
  • 打赏
  • 举报
回复
引用 2 楼 LCL_data 的回复:
[quote=引用 1 楼 独孤由过 的回复:] unique_ptr复制构造函数和复制赋值运算符的声明使用了delete限定符修饰,意味着已被删除,可以使用移动构造函数和移动赋值运算符。 可以使用以下两种移动构造形式: std::unique_ptr<SplitResult> now(std::move(pre)); 或者 std::unique_ptr<SplitResult> now = std::move(pre);
碰到需要转移内部对象时,我都是使用std::unique_ptr<SplitResult> now = std::move(pre);来完成的。 那是我在把pre转到now之后,又使用now导致的? 对于需要共享所有权的,是不是直接使用shared_ptr? 谢谢回复。[/quote] 上面报的错误是由于使用了复制构造函数所致 std::unique_ptr<SplitResult,std::default_delete<_Ty>>::unique_ptr(const std::unique_ptr<_Ty,std::default_delete<_Ty>> &) 简化一下 std::unique_ptr<_Ty>::unique_ptr(const std::unique_ptr<_Ty> &) 参数列表为const std::unique_ptr<_Ty> &,这是复制构造函数的形式 共享所有权是使用shared_ptr,它采用引用计数
十八道胡同 2019-01-25
  • 打赏
  • 举报
回复
引用 1 楼 独孤由过 的回复:
unique_ptr复制构造函数和复制赋值运算符的声明使用了delete限定符修饰,意味着已被删除,可以使用移动构造函数和移动赋值运算符。 可以使用以下两种移动构造形式: std::unique_ptr<SplitResult> now(std::move(pre)); 或者 std::unique_ptr<SplitResult> now = std::move(pre);
碰到需要转移内部对象时,我都是使用std::unique_ptr<SplitResult> now = std::move(pre);来完成的。 那是我在把pre转到now之后,又使用now导致的? 对于需要共享所有权的,是不是直接使用shared_ptr? 谢谢回复。
独孤过 2019-01-25
  • 打赏
  • 举报
回复
unique_ptr复制构造函数和复制赋值运算符的声明使用了delete限定符修饰,意味着已被删除,可以使用移动构造函数和移动赋值运算符。 可以使用以下两种移动构造形式: std::unique_ptr<SplitResult> now(std::move(pre)); 或者 std::unique_ptr<SplitResult> now = std::move(pre);
ztenv 版主 2019-01-25
  • 打赏
  • 举报
回复
都用了smart_ptr了,还有必要使用std::move吗?

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧