簡體   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