繁体   English   中英

如何在 C++ 中编写通用对象池

[英]How to write an generic object pool in c++

我想编写一个通用的对象池类,对象池应该是单例的,很容易在任何地方访问该对象池。

template <class T>
class Pool
{
    T* _freeObjs;
 public:
    Pool<T>& getInstance()
    {
        static Pool<T> instance;
        return instance;
    }
    
    T* acquire() { ... }
    
    void release(T* obj) { ... }
    
 private:
    Pool()
    {
        _freeObjs = (T*)malloc(sizeof(T) * 100);
    }
};

class Foo
{
    int i;
public:
    void* operator new(size_t size) 
    { 
        void * p = Pool<Foo>::getInstance().acquire();
        return p; 
    } 
  
    void operator delete(void * p) 
    {  
        Pool<Foo>::getInstance().release(p);
    } 
};

int main()
{
    {
        Foo* f = new Foo();
        delete f;
    }
    
    return 0;
}

但编译器显示以下错误消息,

错误:无法在没有对象的情况下调用成员函数 'Pool& Pool::getInstance() [with T = Foo]'

void * p = Pool::getInstance().acquire();

更新:谢谢,PaulMcKenzie 在我向 getInstance() 函数添加静态之后,代码就可以工作了。

现在,我将重载运算符 new/delete 移到基类,如果我的以下代码有任何问题?

class PooledObject
{
public:
    void* operator new(size_t size) 
    { 
        void * p = Pool<PooledObject>::getInstance().acquire();
        return p; 
    } 
  
    void operator delete(void * p) 
    { 
        Pool<PooledObject>::getInstance().release((PooledObject*)p);
    } 
};

class Foo : public PooledObject
{
    int i;
public:
};

您的Pool<T>& getInstance()不是static 如果你想在没有创建对象的情况下访问getInstance它需要是一个static函数:

static Pool<T>& getInstance()
{
    static Pool<T> instance;
    return instance;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM