C++ 智能指针 shared_ptr 用法简介

智能指针 shared_ptr

用法:

原本我们使用指针是这样的:

A* a;
a = new A(...);

而智能指针则是这样写:

shared_ptr<A> a;
a = make_shared<A>(...);

shared_ptr的特点:

  • 当即将指向其它内存时,首先会将自身引用计数–
  • 当引用计数为0时,就会释放掉原本指向的内存
  • 接下来指向新的内存,引用计数赋值为原本指向该内存的智能指针数+1

这样就保证了所有没有被指针指向的内存都会被顺利的释放

我们需要做的就是删除掉那些不再需要的shared_ptr元素

多个对象共享底层数据时:

  • 可以通过智能指针来管理共享内存
    比如a对象用智能指针成员在底层动态的创建了数据D,这时b对象拷贝a,同时也拷贝了a的智能指针;在a被销毁时,a中的智能指针销毁,但仍有b中拷贝的智能指针指向底层数据D,并不会影响b对底层数据D的引用,当b也销毁时,没有指针指向这块内存,D顺利释放

talk is cheap:

class Base{
public:
       Base(std::string s) {
              this->data = std::make_shared<std::string>(s);
       }
       std::string getdata() {
              return *data;
       }
private:
       std::shared_ptr<std::string> data;
};


int main() {
       Base* a = new Base("D");
       Base b(*a);
       delete a;
       std::cout << b.getdata() << std::endl;
       return 0;
}

  • 既保证了对象们谁也不能单方面的销毁共享内存,也保证了内存在不再需要的时候能顺利释放

用内置指针初始化智能指针

shared_ptr<T> p(q); //q为内置指针
shared_ptr<T> p(new T(...)); //用new返回的指针初始化智能指针

因为智能指针的构造函数是explicit(禁止隐式类型转换)的,所以必须使用以上直接初始化的形式,以下的做法都是错误的:

shared_ptr<T> p = new T(...);
shared_ptr<T> p = q;

而这样的显式绑定是被允许的:

shared_ptr<T> p = shared_ptr<T>(q); 
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值