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++自己释放内存吗?
...全文
1366 12 打赏 收藏 转发到动态 举报
写回复
用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吗?
C++11unique_ptr智能指针详解 智能指针详解 在《》的基础上,本节继续讲解 C++11 标准提供的另⼀种智能指针,即 unique_ptr 智能指针。 作为智能指针的⼀种,unique_ptr 指针⾃然也具备"在适当时机⾃动释放堆内存空间"的能⼒。和 shared_ptr 指针最⼤的不同之处在 于,unique_ptr 指针指向的堆内存⽆法同其它 unique_ptr 共享,也就是说,每个 unique_ptr 指针都独⾃拥有对其所指堆内存空间的所有 权。 这也就意味着,每个 unique_ptr 指针指向的堆内存空间的引⽤计数,都只能为 1,⼀旦该 unique_ptr 指针放弃对所指堆内存空 间的所有权,则该空间会被⽴即释放回收。 unique_ptr 智能指针是以模板类的形式提供的,unique_ptr(T 为指针所指数据的类型)定义在头⽂件,并位于 std 命名空间 中。因此,要想使⽤ unique_ptr 类型指针,程序中应⾸先包含如下 2 条语句: 1. #include 2. using namespace std; 第 2 句并不是必须的,可以不添加,则后续在使⽤ unique_ptr 指针时,必须标注std::。 unique_ptr智能指针的创建 智能指针的创建 考虑到不同实际场景的需要,unique_ptr 模板类提供了多个实⽤的构造函数,这⾥给读者列举了⼏种常⽤的构造 unique_ptr 智能指针的 ⽅式。 1) 通过以下 2 种⽅式,可以创建出空的 unique_ptr 指针: 1. std::unique_ptr p1(); 2. std::unique_ptr p2(nullptr); 2) 创建 unique_ptr 指针的同时,也可以明确其指向。例如: 1. std::unique_ptr p3(new int); 由此就创建出了⼀个 p3 智能指针,其指向的是可容纳 1 个整数的堆存储空间。 和可以⽤ make_shared() 模板函数初始化 shared_ptr 指针不同,C++11 标准中并没有为 unique_ptr 类型指针添加类似的模 板函数。 3) 基于 unique_ptr 类型指针不共享各⾃拥有的堆内存,因此 C++11 标准中的 unique_ptr 模板类没有提供拷贝构造函数,只提供了移动构造 函数。例如: 1. std::unique_ptr p4(new int); 2. std::unique_ptr p5(p4);//错误,堆内存不共享 3. std::unique_ptr p5(std::move(p4));//正确,调⽤移动构造函数 值得⼀提的是,对于调⽤移动构造函数的 p4 和 p5 来说,p5 将获取 p4 所指堆空间的所有权,⽽ p4 将变成空指针(nullptr)。 4) 默认情况下,unique_ptr 指针采⽤ std::default_delete ⽅法释放堆内存。当然,我们也可以⾃定义符合实际场景的释放规则。值得⼀ 提的是,和 shared_ptr 指针不同,为 unique_ptr ⾃定义释放规则,只能采⽤函数对象的⽅式。例如: 1. //⾃定义的释放规则 2. struct myDel 3. { 4. void operator()(int *p) { 5. delete p; 6. } 7. }; 8. std::unique_ptr p6(new int); 9. //std::unique_ptr p6(new int, myDel()); unique_ptr模板类提供的成员⽅法 模板类提供的成员⽅法 为了⽅便⽤户使⽤ unique_ptr 智能指针,unique_ptr 模板类还提供有⼀些实⽤的成员⽅法,它们各⾃的功能如表 1 所⽰。 表 1 unique_ptr指针可调⽤的成员函数 成员函数名 成员函数名 功 功 能 能 operator*() 获取当前 unique_ptr 指针指向的数据。 operator->() 重载 -> 号,当智能指针指向的数据类型为⾃定义的结构体时,通过 -> 运算符可以获取其内部的指定成员。 operator =() 重载了 = 赋值号,从⽽可以将 nullptr 或者⼀个右值 unique_ptr 指针直接赋值给当前同类型的 unique_ptr 指针。 operator []() 重载了 [] 运算符,当 unique_ptr 指针指向⼀个数组时,可以直接通过 [] 获取指定下标位置处的数据。 get(

64,641

社区成员

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

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