错误发生的场景
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | #include<memory> #include<iostream> //用于测试错误的类 class TestClass { public : int value_=0; }; //用来测试传入unique_ptr的函数 void testPtrFunction(std::unique_ptr<TestClass> ptrHandle) { //输出指针里面的内容 std::cout<<ptrHandle->value_<<std::endl; } int main() { //新建一个智能指针 std::unique_ptr<TestClass> testPtr( new TestClass()); //设置里面的数值 testPtr->value_=10; testPtrFunction(testPtr); return 0; } |
问题分析:在倒数第3行,testPtrFunction(testPtr)会发生题目中的error
原因分析:unique_ptr指向的内存区域只能由一个unique_ptr的对象来指定。把testPtr作为传入参数的时候,就会发现有两个unique_ptr同时指向一个内存区域,实际参数testPtr和形式参数ptrHandle。
修改方案1:把函数的参数类型改成引用的形式,这样参数传入的过程中不会发生参数的复制,testPtr和ptrHandle表示的是同一个对象。
1 2 3 4 5 6 | //用来测试传入unique_ptr的函数 void testPtrFunction(std::unique_ptr<TestClass> &ptrHandle) { //输出指针里面的内容 std::cout<<ptrHandle->value_<<std::endl; } |
修改方案2:如果函数不方便改,可以修改一下传入的参数,直接把一个普通指针包装成unique_ptr传入到函数里面。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | //用来测试传入unique_ptr的函数 void testPtrFunction(std::unique_ptr<TestClass> ptrHandle) { //输出指针里面的内容 std::cout<<ptrHandle->value_<<std::endl; } int main() { //新建一个智能指针 TestClass *testPtr( new TestClass()); //设置里面的数值 testPtr->value_=10; testPtrFunction(std::unique_ptr<TestClass>(testPtr)); return 0; } |
修改方案3:用std::move把unique_ptr移交给函数里面的参数,但这样函数执行完成后,移交进去的unique_ptr对象就不再有原先的控制权了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | //用来测试传入unique_ptr的函数 void testPtrFunction(std::unique_ptr<TestClass> ptrHandle) { //输出指针里面的内容 std::cout<<ptrHandle->value_<<std::endl; } int main() { //新建一个智能指针 std::unique_ptr<TestClass> testPtr( new TestClass()); //设置里面的数值 testPtr->value_=10; testPtrFunction(std::move(testPtr)); std::cout<<testPtr->value_; //这里会发生段错误,这个地方testPtr是一个孤指针 return 0; } |
转载:error: use of deleted function ‘std::unique_ptr<_Tp, _Dp>::unique_ptr(... - 知乎 (zhihu.com)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了