Tengo una clase de plantilla, myFoo, que almacena "cosas" de tipo T que pueden ser primitivas o punteros a tipos complejos. Cuando myFoo se elimina, deseo liberar toda la memoria asociada con todo lo que sucede al almacenar. Esto significa que necesito llamar a eliminar en cada puntero que se almacena, pero también podría terminar llamando a eliminar en una primitiva. ¿Esto es seguro?¿Puedo llamar eliminar en primitivas?
He incluido un boceto de myFoo a continuación para destacar mejor lo que está sucediendo. No estoy seguro si el comportamiento del destructor está bien definido.
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;
}
¿No puedes especializarte para punteros? – chris
Tal como está escrito, su código no tiene sentido para * any * tipo 'T', al menos semánticamente: está confundiendo responsabilidades de propiedad, y la clase sería una pesadilla de usabilidad, legibilidad y mantenibilidad. En resumen, no debe ser * su * preocupación lo que 'T 'es, y el cliente debe hacer su propia limpieza (o, por supuesto, utilizar un puntero inteligente). –
@KerrekSB: Estoy escribiendo una base de datos de tipo. Quiero insertar datos en él. Tiene sentido que la base de datos se apropie de la memoria de las cosas que estoy almacenando dentro de ella. De lo contrario, tendría que gestionar todos los datos de la base de datos externamente. Es un poco "¿verdad?" si lo hago como sugieres. – Daniel