随笔 - 192,  文章 - 0,  评论 - 2,  阅读 - 25万
< 2025年3月 >
23 24 25 26 27 28 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 27 28 29
30 31 1 2 3 4 5

错误发生的场景

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)

  

  

  

posted on   Malphite  阅读(303)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示