如何实现引用计数对象
2006-07-07 11:09
639 查看
引用计数是实现对象共享的一种方式,在c++中被广泛的使用。对于它的实现也有千差万别,我这里仅仅提供一种最为常见的方法,以便大家不时之需。
// Author : Wang yanqing
// Module : Smart pointer
// Version : 0.01
// Date : 03-Aug-2005
// Reversion:
// Date :
// EMail : hello.wyq@gmail.com
#ifndef _SMART_PTR_REFCNT_OBJ_H
#define _SMART_PTR_REFCNT_OBJ_H
#include <algorithm>
#include "smart_ptr_refcnt_impl.h"
#include "noncopyable.h"
template <typename T, typename U>
class RefCntObj
{
RefCntImpl<T, U> *pc;
public:
explicit RefCntObj( T *pt, const U &del )
: pc ( new RefCntImpl<T, U>( pt, del ) )
{
assert( pt != NULL );
assert( pc != NULL );
}
RefCntObj( const RefCntObj &rhs ) : pc( rhs.pc )
{
assert( pc != NULL );
pc->incRefCnt();
}
~RefCntObj()
{
pc->decRefCnt();
}
RefCntObj& operator =( const RefCntObj &rhs )
{
assert( pc != NULL );
assert( rhs.pc != NULL );
// Check itself
if ( this == &rhs || pc == rhs.pc )
return *this;
// decrease old object's reference count
pc->decRefCnt();
// Increase new object's reference count
pc = rhs.pc;
pc->incRefCnt();
return *this;
}
inline void incRefCnt()
{
assert( pc != NULL );
pc->incRefCnt();
}
inline void decRefCnt()
{
assert( pc != NULL );
pc->decRefCnt();
}
inline T* get() const
{
assert( pc != NULL );
return pc->get();
}
inline void swap( RefCntObj &rhs )
{
if ( this == &rhs || pc == rhs.pc )
return;
assert( pc != NULL );
assert( rhs.pc != NULL );
std::swap( pc, rhs.pc );
}
};
#endif
// Author : Wang yanqing
// Module : Smart pointer
// Version : 0.01
// Date : 03-Aug-2005
// Reversion:
// Date :
// EMail : hello.wyq@gmail.com
#ifndef _SMART_PTR_REFCNT_OBJ_H
#define _SMART_PTR_REFCNT_OBJ_H
#include <algorithm>
#include "smart_ptr_refcnt_impl.h"
#include "noncopyable.h"
template <typename T, typename U>
class RefCntObj
{
RefCntImpl<T, U> *pc;
public:
explicit RefCntObj( T *pt, const U &del )
: pc ( new RefCntImpl<T, U>( pt, del ) )
{
assert( pt != NULL );
assert( pc != NULL );
}
RefCntObj( const RefCntObj &rhs ) : pc( rhs.pc )
{
assert( pc != NULL );
pc->incRefCnt();
}
~RefCntObj()
{
pc->decRefCnt();
}
RefCntObj& operator =( const RefCntObj &rhs )
{
assert( pc != NULL );
assert( rhs.pc != NULL );
// Check itself
if ( this == &rhs || pc == rhs.pc )
return *this;
// decrease old object's reference count
pc->decRefCnt();
// Increase new object's reference count
pc = rhs.pc;
pc->incRefCnt();
return *this;
}
inline void incRefCnt()
{
assert( pc != NULL );
pc->incRefCnt();
}
inline void decRefCnt()
{
assert( pc != NULL );
pc->decRefCnt();
}
inline T* get() const
{
assert( pc != NULL );
return pc->get();
}
inline void swap( RefCntObj &rhs )
{
if ( this == &rhs || pc == rhs.pc )
return;
assert( pc != NULL );
assert( rhs.pc != NULL );
std::swap( pc, rhs.pc );
}
};
#endif
相关文章推荐
- 垃圾回收机制中,引入计数是如何实现的,内部原理是什么,怎么维持对象引用的
- C++简单实现对象引用计数示例(转)
- 类对象引用计数使用模板实现(奇特的递归模板模式)
- ATL学习笔记(1):ATL单线程与多线程套间对象引用计数的基础实现
- ATL学习笔记(1):ATL单线程与多线程套间对象引用计数的基础实现
- C++简单实现对象引用计数示例
- ATL是如何实现线程安全的引用计数和多线程控制的
- JavaScript中如何通过arguments对象实现对象的重载
- c# 如何在对象级隐藏接口的实现
- 说下如何查找一下那些对象引用了某对象
- OC学习篇之---数组对象的引用计数问题和自动释放池的概念
- Android基于mAppWidget实现手绘地图(九)–如何处理地图对象的touch事件
- C++如何实现类对象只能动态分配或只能静态分配
- stl实现计数存对象,实现更高形式的抽象
- jquery如何实现点菜单或者菜单里面的对象不隐藏,点菜单外面隐藏
- String:利用引用计数进行实现
- iOS本地数据存储都有哪几种方式?iOS如何实现复杂对象的存储?
- 什么是序列化和反序列化,可以用来做什么?如何在OC中实现复杂对象的存储
- 带引用计数的智能指针(模板类)实现的3种方法
- iOS内存管理系列之一:对象所有权与引用计数