首页 > 解决方案 > 如何在 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:
};

标签: c++templatesobject-pooling

解决方案


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

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

推荐阅读