> 文章列表 > 智能指针shared_ptr

智能指针shared_ptr

智能指针shared_ptr

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比较麻烦

 

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类型的指针