错误发生的场景

#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)

  

  

  

posted on 2023-01-10 14:00  Malphite  阅读(267)  评论(0编辑  收藏  举报