0

對於我的一個類,我正在編寫一個程序,該程序將使用模板化內存池結構來處理類的新實例的分配,同時將它們保持在一起。這是目前聲明如下:作爲朋友功能重載新功能?

template<typename T, unsigned int N> 
class MemoryPool 
{ 
    //Stuff 
}; 

哪裏T是類來創建這個池和N是可以被放置在池中元素的最大數量。我想爲創建的類型重載new,以使與池的交互更容易一些,如果這是合理的做法 - 但我不確定是否是。

我的想法,目前是,如果有可能超載new作爲內MemoryPool朋友功能T應該從那裏是可行的,但我不知道。而且,我不確定開始設置的最佳方式。我嘗試了幾種不同的方法來聲明重載的new,並且在實現它之前我收到了錯誤。

  • 這是一個合理的方式來確保new被覆蓋的任何類使用MemoryPool
  • 這樣做甚至可能嗎?
  • 這樣做甚至是一個好主意嗎?
  • 如何設置函數聲明來完成此操作?

如果它的事項,我使用Visual Studio 2010中

注意,具體使用的模板和超載new是家庭作業的一部分。這就是我希望如果可能的話實現它,以便將來的任務的其餘部分更易於閱讀。所以,如果沒有合理的方法去做,我只需使用MemoryPool中的成員函數來實現相同的目標。

謝謝!

實現示例:

MemoryPool<Object, MAX_OBJECTS> objectPool; //Pool to store objects 
Object* allObjects[MAX_OBJECTS];   //Locations of objects 

//Make a new object (this is how I'd like to do it) 
allObjects[0] = new Object(/*args*/); 

//(If I can't do the above, this would be the alternative) 
allObjects[0] = objectPool.AllocateNewSlot(); 
allObjects[0]->Initialize(/*args*/); 

在這個例子中,使用MemoryPool的負責實際執行的new確保對象在池創建的只是堆上的任何地方,而不是(以確保所有對象是在一個集中的,更可控的位置。

+1

我不明白你想要做什麼。你可以添加一個你想如何使用它的例子嗎? – ronag 2010-11-27 20:29:04

+0

@ronag更新了示例實現。這有幫助嗎? – chaosTechnician 2010-11-27 20:39:38

回答

2

是可能的重載新的運營商,但我會建議反對。

我認爲你在錯誤的打算方向。你不想隱藏事情,並讓用戶不確定發生了什麼。在這種情況下,您應該明確指出您是通過池分配的。

這是你可以做的。

template<typename T, unsigned int N> 
class MemoryPool 
{ 
    T* malloc() 
    { 
     return ... // your pool impl 
    } 

    void free(T* ptr) 
    { 
     ... // your pool impl 
    } 

    void destory(T* ptr) 
    { 
     ptr->T::~T(); // call destructor 
     free(ptr); 
    } 
}; 

int main() 
{ 
    MemoryPool<my_class> pool; 
    my_class* instance = new (pool.malloc()) my_class(/*args*/); // in-place new 
    return 0; 
} 

您還應該看看boost pool的實現方式。