对象池

转载 2012年03月26日 16:38:26


smartpoint


#ifndef __SMART_POINTER_H__
#define __SMART_POINTER_H__

template <class T>
class SmartPointer
{
public:
    typedef T element_type;

    SmartPointer ():_object(NULL), _counter(NULL){}
    SmartPointer(T * object):_object(NULL), _counter(NULL){ Assign(object); }
    SmartPointer(const SmartPointer& sp):_object(NULL), _counter(NULL){ Assign(sp); }
    SmartPointer& operator=(T * object) { Assign(object); return *this; }
    SmartPointer& operator=(const SmartPointer& sp) { Assign(sp); return *this; }
    
    ~SmartPointer() { if (_counter) RemRef(); }
    
    bool operator == (const SmartPointer& sp) { assert(_object != NULL); return ( Get() == sp.Get()); }
    bool operator != (const SmartPointer& sp) { assert(_object != NULL); return ( Get() != sp.Get()); }
    bool operator < (const SmartPointer& sp)  { assert(_object != NULL); return ( Get() > sp.Get()); }
    bool operator()(){ return (_object != NULL); }
    bool operator!() { return (_object == NULL); }
    
    T* operator ->() { assert(_object != NULL); return _object; }
    T& operator * () { assert(_object != NULL); return *_object; }
    const T* operator->() const { assert(_object != NULL); return _object; }
    const T& operator *() const { assert(_object != NULL); return *_object; }
        
    T* Get() const { return _object; }
    int GetCounter() const { return _counter ? *_counter : 0 ?}
    bool Unique() const { return _counter ? (*_counter == 1) : false;}
    
    void Reset(T* object = NULL)
    {
        Assign(object);
    }
    
protected:
    void Assign(T* object)
    {
        if ( _object )
        {
            RemRef();
        }
        
        if ( object )
        {
            try
            {
                _counter = new int;
                AddRef();
            }
            catch ( ... )
            {
                delete object;
                object = NULL;
            }
            
            _object = object;
        }
    }
    
    void Assign(const SmartPointer& sp)
    {
        T* object = sp._object;
        if ( _object != object )
        {
            if ( _counter )
            {
                RemRef();
            }
            _counter = sp._counter;
            _object = sp._object;
            AddRef();
        }
    }
    
    void RemRef()
    {
        assert(_object);
        assert(_counter);
        
        if ( *_counter > 0 && --*_counter == 0 )
        {
            delete _object;
            delete _counter;
        }
        
        _object = NULL;
        _counter = NULL;
    }
    
    void AddRef()
    {
        assert(_counter);
        *_counter++;
    }

private:
    T*      _object;
    int*    _counter;
};



#endif//__SMART_POINTER_H__



相关文章推荐

Java对象池技术的原理

  • 2014年02月01日 03:18
  • 9KB
  • 下载

Unity3d对象池源代码

  • 2015年10月15日 16:08
  • 12KB
  • 下载

apache commons pool之GenericObjectPool分析(通用对象池技术)

在高并发的环境下写程序时通常碰到线程安全的问题,当然,最能想到的就是加锁,再进一步想就是池子了,所谓池子就是,里面可以放置多个同样的对象,每个线程需要用时,就从池中取走,用完时再放回到池中,即可解决线...

JAVA中String类以及对象池的概念

学java的都知道String这个类,是我们一般都要用的一个类,那么我们对这个类又了解多少呢? 下面我来给大家介绍下这个类! String 这个类有两大模式一个是对象池的概念,而另一个就是不变模式...

对象池程序

  • 2007年11月23日 19:55
  • 36KB
  • 下载

dbcp源码解读与对象池原理剖析

apache common-pool工具库是对池化技术原理和具体实现.  对象池(ObjectPool接口): 可以把它认为是一种容器, 它是用来装池对象的, 并且包含了用来创建池对象的工厂对象 ...
  • suixinm
  • suixinm
  • 2014年12月05日 23:41
  • 4739

C#的对象池课件

  • 2008年06月01日 17:52
  • 31KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:对象池
举报原因:
原因补充:

(最多只允许输入30个字)