C++采用引用计数进行内存管理
来源:互联网 发布:燃气灶烤箱一体机 知乎 编辑:程序博客网 时间:2024/06/05 00:59
1.定义引用计数基类CRefCounter
2.定义一个资源类继承自类CRefCounter,则该资源类即具备了引用计数功能
3.定义一个智能指针模板类,来管理资源类
//引用计数基类CRefCounter
class CRefCounter
{
public:
void Duplicate() { m_nCount++;}
//当计数为0时析构自己
void Release() { if(--m_nCount == 0) delete this;}
protected:
//构造函数
CRefCounter():m_nCount(0) {}
//拷贝构造函数
CRefCounter(const CRefCounter& rhs):m_nCount(0) {}
//赋值函数
CRefCounter& operator=(const CRefCounter& rhs) { return *this;}
//析构函数
~CRefCounter() {}
private:
volatile long m_nCount;
}
//资源类
//任何一种类型的数据只要继承CRefCounter
//便具有引用计数功能
class Param : public CRefCounter
{
public:
//构造函数
Param():m_iDate(0x31) {}
~Param() {}
private:
//私有成员和数据
int m_iDate;
};
//智能指针类
template <class T>
class SmartPointer
{
public:
//构造函数
SmartPointer(T* _pT = 0):m_pT(_pT)
{
if(_pT != NULL)
{
//资源引用计数加1
m_pT->Duplicate();
}
}
//析构函数
//智能指针析构自己时,会将管理的资源的计数减1
//如果资源的引用计数值减1后为0,则资源析构自己
~SmartPointer()
{
if(m_pT)
m_pT->Release();
}
//拷贝构造函数
SmartPointer(const SmartPointer<T>& rhs)
{
//资源引用计数加1
m_pT = rhs.m_pT;
m_pT->Duplicate();
}
//赋值函数
SmartPointer<T>& operator=(const SmartPointer<T>& rhs)
{
//证同测试
if(this != &rhs)
{
///注意在赋值前,此处要对m_pT做判空处理
//如果为空则表示该智能指针未管理资源对象
//不为空,当前智能指针管理着资源对象,必须先将当前资源对象计数减1,然后再赋值
if(m_pT != NULL)
{
m_pT->Release();
}
//管理新资源对象
m_pT = rhs.m_pT;
m_pT->Duplicate();
}
return *this;
}
//重载*运算符
T& operator*() const
{ return *m_pT;}
//重载->运算符
T* operator->() const
{ return m_pT;}
private:
T* m_pT;//资源指针
}
- C++采用引用计数进行内存管理
- Objective-C内存管理之引用计数
- Object-C 内存管理引用计数
- objective-C 的内存管理之-引用计数
- objective-C 的内存管理之-引用计数
- Objective-C内存管理之引用计数(一)
- Objective-C内存管理详解——引用计数
- Objective-C内存管理第一弹:引用计数
- ios_oc 内存管理(引用计数)
- 内存管理之引用计数
- 引用计数与内存管理
- 内存管理之引用计数
- 内存管理之引用计数
- 内存管理总结-引用计数
- 引用计数式内存管理
- OC内存管理教程之ARC(一)——objective-c内存管理和引用计数
- Effective Objective-C(第29-36条)内存管理篇,ARC、循环引用、引用计数
- 17-内存管理和自动引用计数
- NIM游戏
- 简单遮罩 实现点击按钮遮住整个页面
- 每日一个C++小程序(四)--DOG类
- 当前顶尖的聊天机器人
- HTTP的GET和POST请求
- C++采用引用计数进行内存管理
- 每日一个C++小程序(五)--根据坐标求矩阵面积
- Emacs用JDEE编写Android程序
- linux free命令与内存机制
- 在spring中映射X.hbm.xml文件的小技巧
- libgdx 打飞机游戏实现教程
- 每日一个C++小程序(六)--基本菜单程序
- Red Hat 7壁纸分享
- hdu A Mathematical Curiosity