0

私のクラスの1つは、テンプレートのメモリプール構造を使用してクラスの新しいインスタンスの割り当てを処理し、それらをまとめて維持するプログラムを作成しています。新しい機能を友人機能としてオーバーロードしていますか?

Tはこのプールを作成するクラスであり、 Nがプールに配置できる要素の最大数である
template<typename T, unsigned int N> 
class MemoryPool 
{ 
    //Stuff 
}; 

を次のように現在では、宣言されています。私はそれが合理的なことならば、プールとのやりとりを少し簡単にするために、作成されたタイプのためにnewをオーバーロードしたいと思います。

私の考えでは、現在、それはそれはそこからなんとかする必要がありますMemoryPoolTためのフレンド関数としてnewをオーバーロードすることは可能ですが、場合、私はわからないということです。そして、私はそれを設定する最善の方法がわからない。私はちょうどオーバーロードされたnewを宣言するためにいくつかの異なる方法を試しました。そして、それを実装する前にエラーが発生しています。

  • これはMemoryPoolを使用するすべてのクラスでnewが確実に上書きされるようにするための合理的な方法ですか?
  • そうでも可能ですか?
  • これはいい考えですか?
  • どのように私はこれを達成するための関数宣言を設定するのですか?

私は、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

+0

@ronagサンプル実装で更新されました。それは役に立ちますか? – chaosTechnician

+0

std :: shared_ptrまたはunique_ptrでカスタムアロケータ/デリータを使用しないのはなぜですか? – Rick

答えて

2

new演算子をオーバーロードすることが可能である、しかし、私はそれに対してアドバイスでしょう。

私はあなたが間違って行っていると思います方向。あなたは物事を隠し、何が起こっているのかをユーザーに確信させたくありません。この場合、プールを介して割り当てていることを明示する必要があります。

あなたができることは次のとおりです。

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がどのように実装されているかを見てください。

+0

ここに明示的に隠れていることに対する良い点があります。私はそれを考えなかった。 – chaosTechnician

関連する問題