C++学习 一、shared_ptr使用

前言

本篇开启C++专题。本来应该从最基础的数据类型开始,但为了服务于看代码,写到哪算哪。

C++11提供了智能指针类,包括unique_ptr,shared_ptr,weak_ptr三种,用以自动释放内存、减少内存泄漏和保障线程安全。首先从shared_ptr开始。

shared_ptr概述

shared_ptr即共享指针,因此多个shared_ptr对象可以与同一个指针相关联。

shared_ptr内部具有两个指针:

  1. 指向对象
  2. 指向控制引用计数的资源

第一个指针与普通指针无异,第二个指针用于计数自身被引用次数。

shared_ptr的构造函数会开辟出新的一片引用计数的资源,引用计数=1;拷贝构造函数不会开辟新的资源,而是使引用计数+1;当shared_ptr对象被销毁时,其相关的引用计数-1;当引用计数为0时,通过delete释放指针指向的内存,销毁指针。

创建shared_ptr对象

0 声明shared_ptr对象

std::shared_ptr<double> p1;

1 通过堆指针创建shared_ptr对象

std::shared_ptr<double> p2(new double(2.));

2 通过拷贝构造函数创建shared_ptr对象

std::shared_ptr<double> p3(p2);
// 等价于
std::shared_ptr<double> p3 = p2;

3 通过赋值运算符修改shared_ptr

p1 = p3;

4 通过std::make_ptr函数初始化

std::shared_ptr<double> p4 = std::make_shared<double>(3.0);
// 也可以初始化一个空对象
std::shared_ptr<double> p4 = std::make_shared<double>();

几个shared_ptr对象初始化问题

shared_ptr类禁止构造函数的隐式转换

 //std::shared_ptr<double> p3 = new double(3.0); error! forbid implicit conversions

这是因为销毁内部指针时,使用的是delete函数。

不能用栈指针进行初始化

//double x = 5.0;
//std::shared_ptr<double> p5(&x);
// error! invalid pointer

不能将同一普通指针给多个shared_ptr对象初始化

//std::shared_ptr<double> p3(p2.get());
//std::shared_ptr<double> p4(p2.get());

上面的初始化通过p2内的对象指针初始化p3和p4,当p3,p4的生命周期结束时,将会包delete double的错误。

原因是:两次初始化得到的p3,p4的引用计数都是1,首先销毁p4,其引用计数变为0,释放p2.get()指针指向的内存;然后销毁p3,其引用也变为0,再次释放内存。

循环引用问题

shared_ptr还有一个容易出现的循环引用问题,代码如下:

class A;
class B;

class A
{
   
public:
    std::shared_ptr<B> b_;
public:
    A(){
   
        std::cout << 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值