shared_ptr共享它指向的对象,内部采用计数机制来实现。当新的shared_ptr与对象关联时,引用计数加1;当shared_ptr超出作用域时,引用计数减1;当引用计数为0时,释放该对象;
初始化方式二:
shared_ptr<A> p0 = std::make_shared<A>("西红柿");//C++11提供
使用方法:
- 重载了*和->操作符,可以像使用指针一样使用shared_ptr
- shared_ptr支持赋值,左值的shared_ptr的计数器将减1,右值shared_ptr的计数器加1;
shared_ptr的线程安全性;
- shared_ptr的引用计数本身是线程安全(引用计数是原子操作)
注意:如果unique-ptr能解决问题,就不要用shared_ptr。unique_ptr的效率更高,占用的资源更少;
指定删除器,shared_ptr比较简单,给unique_ptr比较麻烦
文章来源地址https://www.toymoban.com/news/detail-422821.html
weak_ptr
一.shared_ptr内部维护了一个共享的引用计数器,多个shared_ptr可以指向同一个资源。如果出现了循环引用的情况,引用计数永远无法归0,资源不会被释放
//循环引用demo
#include <iostream>
#include <memory>
using namespace std;
class A;
class B;
class A
{
public:
std::shared_ptr<B> ptr;
~A() {
cout << "A is deleted" << endl; // 析构函数后,才去释放成员变量
}
};
class B
{
public:
std::shared_ptr<A> ptr;
~B() {
cout << "B is deleted" << endl; // 析构函数后,才去释放成员变量
}
};
int main()
{
{
std::shared_ptr<A> ap(new A);
std::shared_ptr<B> bp(new B);
ap->ptr = bp;
bp->ptr = ap;
}
return 0;
}
⑴ weak_ptr指针初始化只能靠shared_ptr指针赋值;
⑵ 当没有一个shared_ptr指针指向weak_ptr指向的内存区域时,expired成员函数返回true;
⑶ 当weak_ptr指针为空时,expired成员函数返回true。
② lock成员函数:返回一个shared_ptr类型的指针
文章来源:https://www.toymoban.com/news/detail-422821.html
到了这里,关于智能指针shared_ptr的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!