0

Pour l'une de mes classes, j'écris un programme qui utilisera une structure de pool de mémoire modélisée pour gérer l'allocation de nouvelles instances d'une classe tout en les maintenant ensemble. Il est actuellement déclarée comme suit:Surcharge en tant que fonction ami?

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

T est la classe pour créer ce pool et N est le nombre maximum d'éléments qui peuvent être placés dans la piscine. Je veux surcharger new pour le type créé pour rendre les interactions avec le pool un peu plus facile si c'est une chose raisonnable à faire - mais je ne suis pas sûr que ce soit le cas.

Mes pensées, actuellement, sont que s'il est possible de surcharger new en fonction ami pour T au sein MemoryPool qu'il devrait être faisable à partir de là, mais je ne suis pas sûr. Et, je ne suis pas sûr de la meilleure façon de commencer à le configurer. J'ai essayé quelques manières différentes de déclarer simplement le new surchargé et j'obtiens des erreurs avant même de l'implémenter.

  • Est-ce une façon raisonnable de faire en sorte que new est surchargée pour toute classe qui utilise MemoryPool?
  • Est-ce possible?
  • Est-ce que c'est une bonne idée?
  • Comment vais-je configurer la déclaration de fonction pour accomplir ceci?

Dans le cas où il importe, j'utilise Visual Studio 2010.

Note, l'utilisation spécifique des modèles et la surcharge sont newpas partie de l'affectation des devoirs. C'est la façon dont je veux l'implémenter si possible pour rendre le reste de la tâche plus facile à lire pour l'avenir. Donc, s'il n'y a pas de moyen raisonnable de le faire, j'utilise simplement les fonctions membres au sein de MemoryPool pour atteindre le même objectif.

Merci!

Exemple mise en œuvre:

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*/); 

Dans cet exemple, l'utilisation du MemoryPool se charge de la mise en œuvre effective de new assurer l'objet est créé dans la piscine au lieu de ne importe où sur le tas (pour assurer que tous les les objets sont dans un système centralisé, emplacement plus contrôlable.

+1

Je ne comprends pas ce que vous voulez faire. Pourriez-vous ajouter un exemple sur la façon dont vous aimeriez l'utiliser? – ronag

+0

@ronag Mise à jour avec exemple d'implémentation. Est ce que ça aide? – chaosTechnician

+0

pourquoi ne pas utiliser un allocateur/suppresseur personnalisé avec std :: shared_ptr ou unique_ptr? – Rick

Répondre

2

il est possible de surcharger le nouvel opérateur, mais je vous conseille contre elle.

Je pense que vous allez dans le mauvais direction. Vous ne voulez pas cacher des choses et rendre les utilisateurs incertains de ce qui se passe. Dans ce cas, vous devez être explicite que vous allouez via un pool.

Voici ce que vous pourriez faire.

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; 
} 

Vous devriez aussi jeter un oeil à la façon dont boost pool est mis en œuvre.

+0

Bon point sur la dissimulation vs être explicite ici. Je n'avais pas pensé à ça. – chaosTechnician