Comment réinitialiser une classe en utilisant placement delete / new à partir d'un modèle?

StackOverflow https://stackoverflow.com/questions/488874

  •  20-08-2019
  •  | 
  •  

Question

J'ai une classe de modèle de gestionnaire de pool. Lorsqu'un objet de classe est rajouté au gestionnaire de pool, je souhaite le réinitialiser à son état initial. J'aimerais appeler le destructeur de placment et le constructeur de placment dessus pour qu'il soit complètement réinitialisé lors de la prochaine distribution par le gestionnaire de la piscine. J'ai essayé de nombreuses façons de faire en sorte que cela fonctionne, mais je suis perplexe. Voici un exemple de ce que j'ai essayé.

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

     obj->T::T(); //call constructor
     //also tried new (obj)T(); //but this doesn't seem to work either

     //then misc code to add a pointer to the object
     //to my list of available objects for re-use later
}

J'ai essayé plusieurs syntaxes et aucune ne semble fonctionner. Le code lui-même est multi-plateforme et devrait donc être compilé avec gcc (sous mingw, linux ou mac) et pour windows, j’utilise toujours vs 2003.

Était-ce utile?

La solution

Que diriez-vous de:

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

Autres conseils

Boost a une bibliothèque . . Il serait peut-être plus facile d’utiliser le leur plutôt que d’écrire le vôtre.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top