Come reimpostare una classe utilizzando il posizionamento Elimina / Nuovo da un modello?

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

  •  20-08-2019
  •  | 
  •  

Domanda

Ho una classe di template per il pool manager. Quando un oggetto classe viene aggiunto nuovamente al gestore del pool, vorrei ripristinarlo al suo stato iniziale. Vorrei chiamare il distruttore del posizionamento e il costruttore del posizionamento su di esso in modo che venga completamente ripristinato per la prossima volta che viene distribuito dal gestore del pool. Ho provato molti modi per farlo funzionare, ma sono sconcertato. Ecco un esempio di quello che ho provato.

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
}

Ho provato un sacco di diverse sintassi e nessuna sembra funzionare. Il codice stesso è multipiattaforma, quindi dovrebbe essere compilato usando gcc (sotto mingw o linux o mac) e per Windows sto ancora usando vs 2003.

È stato utile?

Soluzione

Che ne dici di:

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

Altri suggerimenti

Boost ha una Pool . Potrebbe essere più semplice usare il loro invece di scrivere il tuo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top