博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Mitsuba中的智能指针ref<>和scheduler单例
阅读量:4484 次
发布时间:2019-06-08

本文共 1431 字,大约阅读时间需要 4 分钟。

Mitsuba中随处可见ref<xxx> 和 scheduler

先说说class ref, 它在include\mitsuba\core\ref.h中定义

template
class ref{public: /// Create a NULL reference ref() : m_ptr(NULL) { } /// Construct a reference from a pointer ref(T *ptr) : m_ptr(ptr) { if (m_ptr) ((Object *) m_ptr)->incRef(); } /// Copy-constructor ref(const ref &pRef) : m_ptr(pRef.m_ptr) { if (m_ptr) ((Object *) m_ptr)->incRef(); } /// Destroy this reference ~ref() { if (m_ptr) ((Object *) m_ptr)->decRef(); } ..... private: T* m_ptr;};

ref的作用类似于我们常使用的智能指针,用来管理在堆上申请对象的资源释放。在前面的文章中(http://www.cnblogs.com/wangpei0522/p/4542223.html)谈了谈object基类限制对象只能在堆上申请,如此统一的采用ref来传递和释放资源。

上面的代码中,ref的析构函数~ref()只做了一个操作:m_ptr->decRef(),在object中,有一个成员

volatile mutable int m_refCount;

从字面意思就能读出它的作用:记录该对象被引用的次数。

每次ref的构造函数都调用incRef()把该对象的引用次数加一,而析构函数调用decRef()减一。一旦m_refCount==0,就调用该对象的析构函数(虚函数),释放它的资源。


scheduler是一个单例类,它的声明大概是这样的:

class scheduler{public:   inline static Scheduler* getInstance(){
return m_scheduler;} static void staticInitialization();protected: scheduler(); ~scheduler();private: static scheduler* m_scheduler;};

staticInitialization()在main()中被调用,用于初始化m_scheduler指向的对象。(如果你对单例模式还不熟悉,请看:http://www.cnblogs.com/wangpei0522/p/4460529.html)

通过getInstance()将m_scheduler托管给ref<Scheduler>,同时Scheduler的构造函数和析构函数都设置为protected,不允许手动new/栈上创建对象,也不允许手动调用delete删除m_scheduler的对象。

多么巧妙的设计!

 

转载于:https://www.cnblogs.com/wangpei0522/p/4554909.html

你可能感兴趣的文章
数据库连接池
查看>>
windwos iis 7.5 使用html 报405错误
查看>>
范围(地址转换)
查看>>
Unity3D游戏,TCP,WEBCOSKT,HTTP通信架构 weaving-socket
查看>>
【小程序入门集锦】19,微信小程序个人帐号申请
查看>>
【JAVA零基础入门系列】Day3 Java基本数据类型
查看>>
两个整数,求他们的最小公倍数和最大公约数
查看>>
Mongo索引
查看>>
php 实现设计模式之 建造者模式
查看>>
An Easy C Program Problem
查看>>
Replace Nested Conditional with Guard Clauses(用卫语句代替嵌套循环)
查看>>
jsp中${}是EL表达式的常规表示方式
查看>>
GoldenGate常见问题及处理
查看>>
Android JNI学习(五)——Demo演示
查看>>
SSRS 呈现Barcode Free
查看>>
数据包和html,数据包和数据报有何区别?
查看>>
jq 异步调用一个html,聊聊如何将jQuery的$.ajax()用于异步HTTP请求
查看>>
android 7.0宽度432,全球最小的4G手机,比手掌还小,安卓7.0
查看>>
android fragmentstatepageradapter框架,Android FragmentStatePagerAdapter
查看>>
html怎么加入编辑器,HTML 编辑器
查看>>