2009-01-28 9 views
1

J'ai une classe de modèle de gestionnaire de pool. Quand un objet de classe est ajouté au gestionnaire de pool je voudrais le remettre à son état initial. Je voudrais appeler le destructeur de placage et le constructeur de placage afin qu'il soit complètement réinitialisé pour la prochaine fois qu'il est distribué par le gestionnaire de la piscine. J'ai essayé plusieurs façons de faire fonctionner ça, mais je suis perplexe. Voici un exemple de ce que j'ai essayé. J'ai essayé plusieurs syntaxes différentes et aucune ne semble fonctionner. Le code lui-même est multiplateforme devrait donc compiler avec gcc (sous MinGW ou linux ou mac) et pour Windows je l'utilise encore vs 2003.Comment réinitialiser une classe à l'aide de la suppression/remplacement d'un modèle à partir d'un modèle?

+0

Avez-vous essayé ceci http://stackoverflow.com/questions/362953/what-are-uses-of-the-c-construct-placement-new? ie Casting obj à void * – Ismael

+0

Oui j'ai essayé de le lancer pour annuler et ensuite faire de nouveau (voidobj) T(); À ce moment, je soupçonne que VS2003 est buggé et que j'ai besoin d'être amélioré. – KPexEA

Répondre

3

Que diriez-vous:

template <class T> 
void PoolClass<T>::ReleaseToPool(T *obj) 
{ 
    obj->~T();     //call destructor 
    obj = new ((void *)obj)T(); //call constructor 

    // add a pointer to the object to the list... 
} 
+0

J'ai essayé ce 'obj = new (location) T();' et obtenir une erreur de compilation, quelque chose sur l'emplacement, peut-être que VS 2003 est bogué et que j'ai une nouvelle version de VS? – KPexEA

+0

Appeler delete va libérer sa mémoire, si vous êtes chanceux, vous obtiendrez une violation d'accès. – Ismael

+0

ouais ce que tu veux c'est juste faire obj-> ~ T(); au lieu de supprimer –

2

Boost a une bibliothèque Pool. Il pourrait être plus facile de simplement utiliser le leur au lieu d'écrire le vôtre.

Questions connexes