shared_ptr
【摘要】 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)