错误发生的场景
#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表示的是同一个对象。
//用来测试传入unique_ptr的函数 void testPtrFunction(std::unique_ptr<TestClass> &ptrHandle) { //输出指针里面的内容 std::cout<<ptrHandle->value_<<std::endl; }
修改方案2:如果函数不方便改,可以修改一下传入的参数,直接把一个普通指针包装成unique_ptr传入到函数里面。
//用来测试传入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对象就不再有原先的控制权了。
//用来测试传入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)