Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2350773
  • 博文数量: 816
  • 博客积分: 10000
  • 博客等级: 上将
  • 技术积分: 5010
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-17 17:57
文章分类

全部博文(816)

文章存档

2011年(1)

2008年(815)

分类:

2008-12-17 18:02:33

你好victor, 新年快乐

刚写了个简单的smart pointer类.我觉得要用__一个类__实现完整的SP功能(可以代替普通指针,自动管理内存...)还是不容易,主要是构造函数或operator=传指针进来时,除非建一个list之类的检测指针是否已有引用,不然对同一个指针就会有有多个refCount,造成析构时的灾难.

分开用一个RefCount做对象的基类可以很简单解决SP,但是我觉得对象如果对象类是你不能操纵的那就没办法了,MORE EFFECTIVE C++的那个我就认为不实用.而且对每个对象都public RefCount也麻烦啊:(

不知道有没有好的实现?谢谢

//暂时只支持对象传给SmartPtr一次
//此后SmartPtr代替对象指针使用
template class SmartPtr  
{
friend class SmartPtr;
public:
//NOTE: the pointer can be passed twice!!!
SmartPtr(_T *pointer=0) : _ptr(pointer), _refCount(0)
{
if (pointer)
_refCount = new int(1);
}
SmartPtr(const SmartPtr<_T> &_rhs) : _ptr(0), _refCount(0)
{
*this = _rhs;
}
~SmartPtr()
{
release();
}

void release()
{
if (_ptr) {
if (!(--*_refCount)) {
delete _refCount; _refCount = 0;
delete _ptr;
}
_ptr = 0;
}
}

inline SmartPtr<_T>& operator = (const SmartPtr<_T>& _rhs)
{
if (*this==_rhs) return *this;

release();
if (_ptr = _rhs.getPtr()) {
_refCount = _rhs.getCount();
++*_refCount;
}

return *this;
}

//NOTE: the pointer can be passed twice!!!
inline SmartPtr<_T>& operator = (_T *_rhs)
{
if (_ptr==_rhs) return *this;

release();
if(_ptr = _rhs){
_refCount = new int(1);
}

return *this;
}

inline _T* operator -> () const
{
return _ptr;
}

inline _T& operator * () const
{
return *_ptr;
}

inline operator _T* () const
{
return _ptr;
}

inline bool operator == (const SmartPtr<_T>& _ptr2)
{
return _ptr==_ptr2.getPtr();
}


protected:

inline _T* getPtr() const { return _ptr;};
inline int* getCount() const { return _refCount;};

_T *_ptr;
int *_refCount;
};


--------------------next---------------------

阅读(1032) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~