C++ 引用计数器
来源:互联网 发布:百度的域名值多少钱 编辑:程序博客网 时间:2024/06/05 12:38
今天讲一个实用的东西,C++类的引用计数,不废话直接上代码;
#ifdef WIN32#include <Windows.h>#else#include <atomic> #endifusing namespace std;class CCRefCounter{public: CCRefCounter(); ~CCRefCounter(){}; //增加引用计数; long AddRef(); //减少引用计数,为0的时候自动释放; void Release();private:#ifdef WIN32 //加这个volatile是表示这个变量是易变的,不需要编译器去优化,一切读取都是从内存操作 volatile long refercounter;#else atomic_t refercounter; #endif};CCRefCounter::CCRefCounter(){#ifdef WIN32 this->refercounter = 0;#else atomic_set(&this->refercouter, 0);#endif}long CCRefCounter::AddRef(){#ifdef WIN32 InterlockedIncrement(&this->refercounter); return this->refercounter;#else atomic_add(1, &this->refercounter); return atomic_read(&this->refercounter);#endif}void CCRefCounter::Release(){#ifdef WIN32 InterlockedDecrement(&this->refercounter); if (this->refercounter == 0) { delete(this); }#else atomic_dec(&this->refercounter); if (atomic_read(&this->refercounter) == 0) { delete(this); }#endif return;}
代码很简单,而且大家不要担心有坑,这段代码是经过无数次锤炼的。
说白了就是原子操作,用的时候怎么用?直接继承就可以了。
例如:
class A:public CCReferCounter{public: A(){}; ~A(){};};A* CA =new A();void funB(){ A->AddRef(); //你的代码 A->Rlease();}
释放类的时候不要用delete,改成调用Release()函数,
好处:避免别的多线程的时候,X线程还在使用,结果被其它线程给释放掉了。
坏处:原子操作是很耗时的,会降低运行的效率,尤其是多线程的时候。
学习C++之后你就会发现这是一个深不见底的坑,要想够用不算难,但是要想用明白就不容易了。
0 0
- Objective-C - 自动引用计数器
- 【C++】引用计数器简单示例
- Objective-c 内存管理-MRC 引用计数器
- 引用计数器
- 引用计数器
- [C#]计数器
- Python的引用计数器
- reference counter 引用计数器
- 初学c++引用计数器
- MRC环境 引用计数器
- string奇怪引用计数器
- C++ 引用计数器
- 对象引用计数器
- 在Objective-C中 NSString并不受引用计数器机制管理
- [试验]在Objective-C中 NSString并不受引用计数器机制管理
- 在Objective-C中 NSString并不受引用计数器机制管理
- objective-c---SEL、内存管理(引用计数器、野指针、@property参数、循环retain、autorelease)
- 学习笔记:Objective C 的内存管理(1)----引用计数器
- 共同学习Java源代码--数据结构--Set接口
- 理解 openstack 中的 service catalog
- 安卓开源项目周报1214
- webpack应用学习
- ARM汇编编程基础(五) -- 其它常见寻址模式与常见指令
- C++ 引用计数器
- [JAVA] Swing 边框用法
- 安卓接入微信支付解析,细数开发过程中遇到的坑
- C/C++——网络开发
- maven 启动 报错 Fatal error compiling: 无效的目标发行版
- SDL_CreateWindow函数
- 浅谈算法和数据结构: 四 快速排序
- iOS "xxxx" file not found
- 使用 Order By字句对查询结果进行排序