• 忘掉天地
  • 仿佛也想不起自己
bingliaolongBingliaolong  2021-09-02 13:18 Aet 隐藏边栏 |   抢沙发  16 
文章评分 2 次,平均分 5.0

概述

  1. 在广义上,智能指针划分为两类。

  2. 第一类智能指针引用的对象是可以共享的,也就是一个对象可以同时被多个智能指针引用。
    这类智能指针要求被引用的对象具有计数的功能,数值的大小就表示它目前被多少个智能指针引用。当一个对象的引用计数值等于0的时候,就表示它要被释放了。
    这类智能指针适合作为函数参数或者返回值在模块之间进行传递,从而实现共享。

  3. 第二类智能指针引用的对象是独占的,也就是一个对象同一时刻只可以被一个智能指针引用。这类智能指针不要求被引用对象具有计数的功能。
    只要这类智能指针的生命周期超出了它自己的范围,那么它引用的对象就会被自动销毁。
    这类智能指针适合在函数或者内部使用,用来自动化释放那些不需要了的对象。

第一类:scoped_refptr

  1. 由于它要求被引用对象具有计数功能,因此就提供了一个具有计数功能的基类RefCounted。当一个对象可以被类scoped_refptr描述的对象引用时,它就必须要从基类RefCounted继承下来。

线程安全版本

RefCountedThreadSafe类可以通过模板参数Traits指定一个类,当它引用的目标对象的引用计数等于0的时候,就会调用该参数Traits指定的类的静态成员函数Destruct来释放目标对象。

比如我们在一个线程创建一个T对象,这个T对象可能会被其它线程引用。当这个T对象的引用计数是在其它线程减少为0时,我们希望它不要在其它线程释放,而是要在创建线程进行释放,那么就可以通过指定参数Traits来实现。如果没有指定模板参数Traits,那么它的默认值就为DefaultRefCountedThreadSafeTraits。

scoped_refptr

make_scoped_refptr

第二类:scoped_ptr

  1. 通过宏COMPILE_ASSERT以及IsNotRefCounted类的静态成员变量value禁止scoped_ptr智能指针引用的目标对象从RefCounted类或者ThreadSafeRefCounted类继承下来,也就是不要求目标对象具有引用计数功能。
  2. 通过宏MOVE_ONLY_TYPE_FOR_CPP_03禁止scoped_ptr智能指针的copy语意,但是提供move语意。

scoped_ptr类将引用的目标对象间接保存在成员变量impl_描述的一个scoped_ptr_impl对象中。

WeakPtr

WeakPtr类继承于WeakPtrBase类。WeakPtrBase类有一个成员变量ref_,它指向一个WeakReference对象。

一个对象如果需要被弱智能指针引用,那么它所属的类就必须要继承于SupportsWeakPtr类。SupportsWeakPtr类又是继承于SupportsWeakPtrBase类的。SupportsWeakPtrBase类有一个静态成员函数StaticAsWeakPtr,用来将一个间接继承于SupportsWeakPtr类的子类对象封装成一个WeakPtr弱智能指针。
SupportsWeakPtr类有一个成员函数AsWeakPtr,用来将一个SupportsWeakPtr子类对象封装成一个WeakPtr弱智能指针。在封装的过程中,需要用到成员变量weak_reference_owner_指向的一个WeakReferenceeOwner对象。

WeakReferenceeOwner类有一个成员变量flag_,它指向一个Flag对象。这个Flag对象有一个布尔类型的成员变量isvalid。当一个WeakReferenceeOwner对象所属的SupportsWeakPtr对象被销毁时,也就是它的析构函数被调用的时候,这个WeakReferenceeOwner对象的成员函数Invalidate就会被调用。WeakReferenceeOwner类的成员函数Invalidate又会进一步调用成员变量flag_指向的一个Flag对象的成员函数Invalidate,将该Flag对象的成员变量is_valid_的值设置为false,表示一个相应的SupportsWeakPtr对象被销毁了。

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

bingliaolong
Bingliaolong 关注:0    粉丝:0 最后编辑于:2021-11-20
Everything will be better.

发表评论

表情 格式 链接 私密 签到
扫一扫二维码分享