C++11 智能指针

RAII

RAII(Resource Acquisition ls Initialization 资源获取即初始化),是一种使用局部对象来管理资源的技术这里的资源主要是指操作系统中有限的东西如内存(heap)、网络套接字,互斥量,文件句柄等等,局部对象是指存储在栈的对象,它的生命周期是由操作系统来管理的,无需人工介入。

这种做法有两大好处:

  • 不需要显式地释放资源。 
  • 采用这种方式,对象所需的资源在其生命期内始终保持有效。

智能指针

在C++中,动态内存的管理是通过new和delete两个运算符完成的,动态内存的使用有时候会忘记释放内存,造成内存泄漏的问题。

智能指针本质上一个类模板,它可以创建任意的类型的指针对象,当智能指针对象使用完后,对象就会自动调用析构函数去释放该指针所指向的空间。所有的智能指针类模板中都包含一个私有的指针对象,以及构造函数和析构函数。

智能指针的使用跟普通指针类似,可以使用运算符“ * " 和 ” -> "去获得指向的对象。

但是如果类中不定义拷贝构造函数和赋值构造函数,就只能调用类中原生的拷贝构造函数和赋值重载函数。当两个指针指向同一块空间时,如果ptr1释放了资源对象后,ptr2再去释放该资源,程序就会崩溃。

C++版本库

在C++11中,提供了四种类型的智能指针

auto_ptr

auto_ptr是c++98版本库中提供的智能指针,该指针解决上诉的问题采取的措施是管理权转移的思想,即原对象拷贝给新对象的时候,原对象会被设置为nullptr,此时只有新对象指向一块资源空间。这个智能指针很可能导致程序崩溃,因此不建议使用

unique_ptr 

unique_ptr是c++11版本库中提供的智能指针,它直接将拷贝构造函数和赋值重载函数给禁用掉,因此,不让其进行拷贝和赋值。但可以通过std::move进行所有权转移。

share_ptr

share_ptr是c++11版本库中的智能指针,shared_ptr允许多个智能指针可以指向同一块资源,并且能够保证共享的资源只会被释放一次。

shared_ptr采用引用计数器来实现多个shared_ptr对象之间的资源共享,它会跟踪有多少个智能指针指向同一个资源,当最后一个shared_ptr被销毁时,资源才将会被释放。

多线程的安全问题

但是,引用计数器指向的对象在堆上,因此所有的线程都能够访问到该资源,多线程在修改引用计数器时,会出现线程安全问题,需要用锁来保证其数据的正确性。

循环引用问题

假设我们要使用定义一个双向链表,如果我们想要让创建出来的链表的节点都定义成shared_ptr智能指针,那么也需要将节点内的_pre和_next都定义成shared_ptr的智能指针。如果定义成普通指针,那么就不能赋值给shared_ptr的智能指针。

  • 当创建出node1和node2智能指针对象时,引用计数都是1.
  • 当node1的next指向node2所指向的资源时,node2的引用计数就+1,变成2,node2的pre指向noede1所指向的资源时,node1的引用计数+1,变成2.
  • 当这两个智能指针使用完后,调用析构函数,引用计数都-1,都变成1,由于引用计数不为0,所以node1和node2所指向的对象不会被释放。

weak_ptr

它也是C++11版本库中提供的智能指针,它可以指向一个由shared_ptr管理的对象,但它不参与引用计数,主要用来解决shared_ptr可能会引发的循环引用问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

惊雲浅谈天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值