C++ 新特性之智能指针

本文介绍了C++中智能指针的引入原因,包括自动回收堆内存的需求,以及auto_ptr、unique_ptr、shared_ptr和weak_ptr的不同特性和应用场景。重点讲解了unique_ptr的独占性质、shared_ptr的引用计数机制和weak_ptr用于解决循环引用问题的特点。
摘要由CSDN通过智能技术生成

一、引入智能指针的原因

        程序开发过程中需要频繁使用到堆内存,但由于堆内存的申请和驶方都是由程序员自己管理的,程序复杂时,容易出现程序员忘记释放内存而导致内存泄漏的问题。因此,C++引入智能指针来实现堆内存的自动回收,它可以在适当时机自动释放分配的内存。

二、支持标准

        C++98/03 标准中,支持使用 auto_ptr 智能指针来实现堆内存的自动回收;

        C++11 新标准在废弃 auto_ptr 的同时,增添了 unique_ptr、shared_ptr 以及 weak_ptr 这 3 个智能指针来实现堆内存的自动回收。

三、定义和设计原则

        智能指针是在 <memory> 头文件中的 std 命名空间中定义的。

        智能指针的设计原则是在内存和性能上尽可能高效。 

四、不同智能指针的特性

  • unique_ptr

        只允许基础指针的一个所有者(独占指针)。

        它无法复制到其他unique_ptr,无法通过值传递到函数,也无法用于需要副本的任何 C++ 标准库算法,只能移动unique_ptr。这意味着,内存资源所有权将转移到另一unique_ptr,并且原始unique_ptr不再拥有此资源。建议将对象限制为由一个所有者所有,因为多个所有权会使程序逻辑变得复杂。因此,当需要智能指针用于纯 C++ 对象时,可使用unique_ptr,而当构造unique_ptr时,可使用make_unique函数。

        unique_ptr的基本特征为:可移动,但不可复制。“移动”将所有权转移到新unique_ptr并重置旧unique_ptr。

  • shared_ptr

        采用引用计数的智能指针(共享指针)。 

        如果想要将一个原始指针分配给多个所有者(例如,从容器返回了指针副本又想保留原始指针时),请使用该指针。直至所有shared_ptr所有者超出了范围或放弃所有权,才会删除原始指针。大小为两个指针;一个用于对象,另一个用于包含引用计数的共享控制块。

        初始化一个shared_ptr之后,可复制它,按值将其传入函数参数,然后将其分配给其他shared_ptr实例。所有实例均指向同一个对象,并共享对一个“控制块”(每当新的shared_ptr添加、超出范围或重置时增加和减少引用计数)的访问权限。当引用计数达到零时,控制块将删除内存资源和自身。

        第一次创建内存资源时,请使用make_shared函数创建shared_ptr。make_shared异常安全,它使用同一调用为控制块和资源分配内存,会减少构造开销。如果不使用make_shared,则必须先使用显式new表达式来创建对象,然后才能将其传递到shared_ptr构造函数。

  • weak_ptr

        结合 shared_ptr 使用的特例智能指针。

        shared_ptr的一个最大的陷阱是循环引用,循环引用会导致堆内存无法正确释放,导致内存泄漏。为了解决shared_ptr的循环引用的问题,引入新的智能指针std::weak_ptr。weak_ptr在赋值的时候,不会引起智能指针计数增加。

        weak_ptr本身不参与引用计数,因此它无法阻止引用计数变为零。但是可以使用weak_ptr尝试获取初始化该副本的shared_ptr的新副本。 若已删除内存,则weak_ptr的bool运算符返回false;若内存仍然有效,则新的共享指针会递增引用计数,并保证只要shared_ptr变量保留在作用域内,内存就会有效。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值