你好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---------------------
阅读(1027) | 评论(0) | 转发(0) |