错误发生的场景
#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)
浙公网安备 33010602011771号