Ho una classe basata su modelli, myFoo, che memorizza "roba" di tipo T che può essere primitiva o puntatore a tipi complessi. Quando myFoo viene cancellato, voglio rilasciare tutta la memoria associata a tutto ciò che accade per essere memorizzata. Ciò significa che ho bisogno di chiamare delete su ogni puntatore che viene memorizzato, ma potrei anche finire per chiamare delete su una primitiva. È sicuro?Posso chiamare delete su primitive?
Ho incluso uno schizzo di myFoo qui sotto per evidenziare meglio cosa sta succedendo. Non sono sicuro che il comportamento del distruttore sia ben definito.
template<class T>
class myFoo
{
public:
myFoo(int size)
{
size_ = size;
T* foo = new T[size_];
}
void addFoo(T tmp, int index)
{
foo[index] = tmp;
}
virtual ~myFoo()
{
for(int i=0; i < size_; i++)
{
delete foo[i];
}
delete [] foo;
}
private:
int size_;
T* foo;
}
Non sei specializzato per i suggerimenti? – chris
Come scritto, il tuo codice non ha senso per * qualsiasi * tipo 'T', almeno semanticamente: stai mescolando le responsabilità di proprietà, e la classe sarebbe un incubo di usabilità, leggibilità e manutenibilità. In breve, non dovrebbe essere * tuo * preoccupare di cosa sia 'T', e il cliente dovrebbe fare la sua pulizia (o ovviamente usare un puntatore intelligente). –
@KerrekSB: Sto scrivendo un database di sorta. Voglio inserire i dati in esso. Ha senso che il database diventi proprietario della memoria di cose che sto immagazzinando al suo interno. Altrimenti avrei bisogno di gestire tutti i dati dal database esternamente. È un po '"wtf ??" se lo faccio come suggerisci tu. – Daniel