对象保护计数类

来源:互联网 发布:unity3d 给模型加动画 编辑:程序博客网 时间:2024/05/23 21:24

作为CSDN第一篇,对Guard类代码进行研读和debug,总结以下几点:

1.Guard类内包含core struct,该struct提供实际存入其中的Guard对象的方法,并提供引用计数管理

2.Guard类中重载多个构造函数,只有不带参的默认构造函数申明为explicit,即不允许编译器隐式调用该函数

3.调用 BJGuard& operator=(const BJGuard& other)后,调用该函数的对象通过this指针被销毁;其core指针被重新赋值;引用计数增加

调用前

调用后



4.bool操作符重载,使用方法直接在if语句内判断对象名即可。debug后发现该程序应用于多线程场合,虽然引用计数是原子操作,但是operator=语句可能不是。因此需要valid判断。


最后上代码

#include <cstdio>#include <stddef.h>#include <stdio.h>class BJGuard{public:explicitBJGuard(char* str, bool isMaster = true) : m_BJCore(new BJCore(isMaster ? this : NULL)), m_str(str){printf("BJGuard:BJGuard(bool isMaster = true) called========%s\n", m_str);m_BJCore->AddRef();}BJGuard(char* str, const BJGuard& other) : m_BJCore(other.m_BJCore), m_str(str) {printf("BJGuard:BJGuard(const BJGuard& other) called========%s\n", m_str);m_BJCore->AddRef();}BJGuard(char* str, BJGuard& other) : m_BJCore(other.m_BJCore), m_str(str) {printf("BJGuard:BJGuard(BJGuard& other) called========%s\n", m_str);m_BJCore->AddRef();}~BJGuard() {m_BJCore->Release(this);}BJGuard& operator=(const BJGuard& other) {printf("BJGuard:operator=(const BJGuard& other) called\n");printf("BJGuard:operator=(const BJGuard& other) called, %s will be release\n", m_str);m_BJCore->Release(this);m_BJCore = other.m_BJCore;m_BJCore->AddRef();return *this;}void reset(bool isMaster = true) {m_BJCore->Release(this);m_BJCore = new BJCore(isMaster ? this : NULL);m_BJCore->AddRef();}inline operator bool() const { printf("BJGuard:operator bool() called\n"); return m_BJCore->valid(); }private:struct BJCore{explicit BJCore(BJGuard* _master) : m_master(_master), m_refCount(0) {printf("BJCore(BJGuard* _master) called\n");printf("BJCore(BJGuard* _master) called\n");}inline void AddRef() {__sync_add_and_fetch(&m_refCount, 1);}inline void Release(BJGuard* guard) {if (m_master == guard) {m_master = NULL;printf("BJCore:Release(BJGuard* guard) called, m_master is NULL\n");}if (0 == __sync_sub_and_fetch(&m_refCount, 1)) {delete this;}}inline bool valid()    const { if (m_master) {return true;}else {return false;}}inline BJGuard* master() const { return m_master; }private:BJCore(BJCore& other);BJCore operator =(BJCore& other);private:BJGuard* m_master;int    m_refCount;};private:BJCore* m_BJCore;char* m_str;};

希望能保持下去。


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 痔疮内扎手术后直肠窄小怎么办 2个月大的宝宝鼻塞怎么办 宝宝鼻屎比较深怎么办 来例假痔疮犯了怎么办 微医爽约过一次怎么办 炸完的薯条软了怎么办 学信网号码换了怎么办 学信网注册换手机了怎么办 学信网手机号码已被注册怎么办 学信网手机号码被注册了怎么办 去英国留学不会做饭怎么办 小米陶瓷刀钝了怎么办 橱柜的缝擦不到怎么办 悠悠球上油早了怎么办 买了没有esp的车怎么办 饥荒海难狗来了怎么办 饥荒海难拖网掉水里了怎么办 饥荒遇到了猪人怎么办 饥荒龙蝇赖在家不走怎么办 饥荒海难崩档了怎么办 gta5全是rpf文件怎么办 饥荒没有海象人营地怎么办 饥荒海滩猎犬来了怎么办 宝宝换牙门牙上长颗尖牙怎么办 肉卡在牙缝里怎么办 电脑做系统卡死怎么办 苹果6升级太卡怎么办 电脑玩不了联机饥荒怎么办 饥荒渡渡鸟死了一只怎么办 饥荒电脑联机植物生病怎么办 开车蹭到别人车怎么办 立定跳不会收腹怎么办 1岁宝宝有蛔虫怎么办 手机屏幕总是有网页跳出来怎么办 cs游戏屏幕变成正方形怎么办 大王卡被收回了怎么办 模拟人生4小人生病了怎么办 创造与魔法死后怎么办? 脚不小心扭伤了该怎么办 小鸡脚扭伤了该怎么办 跳高比赛最终成绩相等怎么办