biowep
16-11-2014, 10:26
Salve,
In che modo posso eliminare un elemento da una mappa di unique_ptr senza generare un loop di chiamate al distruttore?
Ho la seguente classe:
#include <map>
template<typename T, typename TKey = std::string>
class Pool {
protected:
static std::map<TKey, std::unique_ptr<T>> pool;
MultiKeyPool(TKey ID);
virtual ~MultiKeyPool() {
if (pool.count(ID)) {
pool.erase(ID);
}
}
}
Il distruttore potrei doverlo chiamare anche prima della fine del programma, per cui in tal caso dovrebbe eliminare dalla mappa l'elemento che sto eliminando.
Il problema è che quando chiamo il distruttore, allora si genera un loop di chiamate perché il distruttore che elimina dalla mappa l'elemento fa in modo che unique_ptr chiami ancora il distruttore (perché sta andando out of scope) e così via.
So che posso specificare una funzione personalizzata per il distruttore ma non ho capito esattamente come fare ed il mio dubbio è: come viene eliminato l'elemento da una funzione esterna (non ~MultiKeyPool(), per intenderci)? Ha lo stesso effetto?
In che modo posso eliminare un elemento da una mappa di unique_ptr senza generare un loop di chiamate al distruttore?
Ho la seguente classe:
#include <map>
template<typename T, typename TKey = std::string>
class Pool {
protected:
static std::map<TKey, std::unique_ptr<T>> pool;
MultiKeyPool(TKey ID);
virtual ~MultiKeyPool() {
if (pool.count(ID)) {
pool.erase(ID);
}
}
}
Il distruttore potrei doverlo chiamare anche prima della fine del programma, per cui in tal caso dovrebbe eliminare dalla mappa l'elemento che sto eliminando.
Il problema è che quando chiamo il distruttore, allora si genera un loop di chiamate perché il distruttore che elimina dalla mappa l'elemento fa in modo che unique_ptr chiami ancora il distruttore (perché sta andando out of scope) e così via.
So che posso specificare una funzione personalizzata per il distruttore ma non ho capito esattamente come fare ed il mio dubbio è: come viene eliminato l'elemento da una funzione esterna (non ~MultiKeyPool(), per intenderci)? Ha lo stesso effetto?