shared_ptr

举报
无敌清风蓝 发表于 2023/08/31 22:13:21 2023/08/31
【摘要】 shared_ptr

1. shared_ptr

这个是共享的,工作原理是使用了引用计数,每一个shared_ptr指向了相同的对象(内存),只有最后一个不指向的时候,才会去析构所指向的对象

shared_ptr一般形式:

shared_ptr<指向的类型> 智能指针名

shared_ptr<string> p1; //这是一个指向string的智能指针,名字为p1

这种默认初始化的情形,该智能指针里面保存的是一个空指针nullptr(可以指向类型为string的对象)

1.1.常规初始化(shared_ptr和new搭配)


shared_ptr<int> pi(new int(100)); //pi指向一个值为100的int型数据
shared_ptr<int> pi2 = new int(100) //这个写法是错误的,智能指针是explicit,是不可以进行隐式转换的,必须用直接初始化形式,而带等号一般都表示要隐式类型转换

对于返回值是shared_ptr<int>类型,看下面的例子

shared_ptr<int> makes(int value)
{
    return new int(value); //不可以,因为无法把new得到的int*转换到shared_ptr
}

所以需要修改为

shared_ptr<int> makes(int value)
{
    return shared_ptr<int>(new int(value)); //这是可以的,显式用int*创建shared_ptr<int>
}

裸指针可以初始化shared_ptr,但这是不推荐的用法,智能指针和裸指针不要穿插使用,容易出问题,尽量使用make_shared

看一个裸指针初始化shared_ptr可能遇到的陷阱

int * pi = new int;
shared_ptr<int> p1(pi);

这个写法不推荐,虽然内存也能正常释放,但即使用裸指针也应该直接传递new运算符,而不是传递一个裸指针变量,修改如下

shared_ptr<int> p1(new int);

1.2.make_shared函数初始化


这是标准库里的函数模板,被认为是最安全和更高效的分配和使用shared_ptr智能指针的一个函数模板

它可以在动态内存(堆)中分配并初始化一个对象,然后返回指向此对象的shared_ptr

share_ptr<int> p2 = std::make_shared<int>(100); //这个shared_ptr指向一个值为100的整型内存,类似于int * pi = new int(100);
share_ptr<string> p3 = std::make_shared<string>(5,'a');//5个字符a,类似于string mystr(5,'a');,注意到make_shared后圆括号里的参数形式取决于<>中的类型名,此时这些参数必须和string里的某个构造函数匹配
shared_ptr<int> p4 = maked_shared<int>();//p4指向一个int,int里面保存的的值是0,这个就是值初始化
p4 = make_shared<int>(400); //p4释放刚才的对象,重新指向对象
auto p5 = std::make_shared<string>(5,'a'); //用auto保存make_shared结果

make_shared使用起来挺好,但是如果用它生成shared_ptr对象,就没有办法自定义删除器了

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。