Qt源码剖析-智能指针.pdf
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
Qt源码剖析-智能指针 ⽬录 智能指针是什么? 智能指针是什么? 1. 智能指针是使⽤RAII技术(惯⽤⼿法)对裸指针进⾏封装、隔离、管理。 2. 把堆对象转移为栈对象。 为什么使⽤ 为什么使⽤QT智能 智能(smart)指针? 指针? CPP中在使⽤堆内存时我们必须使⽤指针,使⽤指针给我带来便利和强⼤的威⼒同时也给我们带来了很多隐患,所以指针也是把双刃剑。 常见的隐患有: 1. 我们在使⽤new创建⼀个对象的同时,由于种种原因⽽忘记了delete从⽽导致内存泄漏影响应⽤运⾏效率 2. 我们在使⽤⼀个指针的时候不知道该指针指向的对象是否已经析构,从⽽导致使⽤⼀个错误的野指针。 针对上述问题Qt提供⼀组类模板(Smart指针类)来管理C++中的裸指针, 同时提供相关重载运算符使得使⽤起来与指针操作⽆异。 指针的⽣ 命周期也交由Smart类来管理⽽不⽤程序员⾃⼰去⼿动管理。使⽤Smart指针进⽽避免了上述隐患的存在。 Qt提供了哪些智能指针? 提供了哪些智能指针? QPointer、QSharedPointer、QScopedPointer、QWeakPointer、QSharedDataPointer、QExplicitlySharedDataPointer、 QGuard、QtPatternist::AutoPtr 由于Qt智能指针较多,避免篇幅较长本⽂只对平时使⽤场景较多的QSharedPointer源码进⾏分析也⽐较有代表性 QSharedPointer 官⽅介绍: QSharedPointer类持有对共享指针的强引⽤。QSharedPointer是c++中的⼀个⾃动共享指针。它的⾏为与⽤于普通⽬的的普通指针完全 相同,包括对constness的尊重。当指针超出作⽤域时,QSharedPointer将删除它所持有的指针,前提是没有其他QSharedPointer对象 引⽤它。QSharedPointer对象可以从普通指针、另⼀个QSharedPointer对象或通过将QWeakPointer对象提升为强引⽤来创建。 本⽂基于Qt5.12.4版本分析 QSharedPointer类模板 类模板(smart指针类 指针类)源码分析 源码分析 QSharedPointer类源码篇幅较长,避免出现阅读疲劳以下分段解读。 1. QSharedPointer类模板对于模板参数 类模板对于模板参数T的类型重定义 的类型重定义 template <class T> class QSharedPointer { typedef T *QSharedPointer:: *RestrictedBool; typedef QtSharedPointer::ExternalRefCountData Data; public: typedef T Type; typedef T element_type; typedef T value_type; typedef value_type *pointer; typedef const value_type *const_pointer; typedef value_type &reference; typedef const value_type &const_reference; typedef qptrdiff difference_type; }; QSharedPointer提供了部分公有和私有的对于模板参数T的类型重定义(说明: 这⾥T类型并不是指⼀个特定类型,⽽是⼀个通⽤/万能类 型。 我们可以把类模板看做成⼀个函数 QSharedPointer为函数名, template中类型列表的为函数形参列表,typedef 为返回值。 T最终 的类型确认待你使⽤时由编译器实例化模板时才能推导出),QSharedPointer类模板分别重定义了模板⼊参T的类型别名、指针、常指针、 引⽤、常引⽤类型。这也是模板的惯⽤⼿法和伎俩⽅便对于类型的获取和使⽤ 原因有以下⼏点: a. 提供公有的对于T的类型重定义⽅便的类外部获取和使⽤T及其衍⽣类型。 b. 类内部实现过程中统⼀,规范对于T的使⽤。 2. QSharedPointer的成员属性 的成员属性 template <class T> class QSharedPointer { // @1 Type *value; // @2 Data *d; }; QSharedPointer成员属性⽐较简洁代码段@1声明成员属性value(需要管理的裸指针), 代码段@2声明属性d。Data类型我们从第1点中可 知为QtSharedPointer::ExternalRefCountData 的类型别名。主要作⽤为记录当前持有value的QSharedPointer
剩余11页未读,继续阅读
- 粉丝: 168
- 资源: 3万+
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助