Ich habe eine Template-Klasse, myFoo, die "stuff" vom Typ T speichert, die entweder primitiv oder Zeiger auf komplexe Typen sein kann. Wenn myFoo gelöscht wird, möchte ich den gesamten Speicher freigeben, der mit allem verknüpft ist, was gerade gespeichert wird. Das bedeutet, dass ich für jeden gespeicherten Zeiger löschen muss, aber ich könnte auch löschen auf einem Primitiv aufrufen. Ist das sicher?Kann ich löschen auf Primitiven aufrufen?
Ich habe unten eine Skizze von myFoo eingefügt, um besser hervorzuheben, was vor sich geht. Ich bin mir nicht sicher, ob das Verhalten des Destruktors gut definiert ist.
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;
}
Können Sie nicht für Zeiger spezialisieren? – chris
Wie geschrieben, macht Ihr Code keinen Sinn für * any * Typ 'T', zumindest semantisch: Sie vermischen Verantwortlichkeiten des Eigentums, und die Klasse wäre ein Albtraum der Benutzerfreundlichkeit, Lesbarkeit und Wartbarkeit. Kurz gesagt, es sollte nicht Ihr Anliegen sein, was "T" ist, und die Klientin sollte ihre eigene Reinigung vornehmen (oder natürlich einen intelligenten Zeiger verwenden). –
@KerrekSB: Ich schreibe eine Datenbank von Arten. Ich möchte Daten einfügen. Es macht Sinn, dass die Datenbank den Besitz von Dingen übernimmt, die ich darin aufbewahre. Ansonsten müsste ich alle Daten von der Datenbank extern verwalten. Es ist ein bisschen "wtf ??" wenn ich es so mache, wie du es vorschlägst. – Daniel