andere schon erwähnt haben, dass Sie nicht übereinstimmen new[]
mit delete
haben und Sie müssen delete
ändern delete[]
, um es zu beheben. Dies ist jedoch nur der erste Ihrer Probleme.
Sie müssen auch den Kopierkonstruktor und den Kopierzuweisungsoperator implementieren (oder zumindest als privat deklarieren). Andernfalls darüber nachdenken, was passiert, wenn Sie dies tun:
{
Container c1;
Container c2(c1);
} // c2.~Container(); // frees the memory pointed to by 'BasePointer'
// c1.~Container(); // also frees the memory pointed to by 'BasePointer'.
Seit dem BasePointer
Mitglied beiden c1
und c2
Punkte auf das gleiche Array, es zweimal freigegeben wird.
Es gibt einige einfacher zu bedienende Alternativen:
Betrachten wir ein std::vector
überall verwenden Sie sonst eine dynamisch zugewiesene Array verwenden können. Da Ihre Klasse Container
heißt, nehme ich an, dass Sie versuchen, einen Ressourcenbesitz Container zu implementieren, also vielleicht möchten Sie dies nicht verwenden.
Verwenden Sie eine boost::scoped_ptr
oder std::unique_ptr
(wenn Ihr Compiler dies unterstützt), um den Besitz des Zeigers zu verwalten. Beides unterdrückt die Generierung des implizit deklarierten Kopierkonstruktors und zwingt Sie, Ihre eigenen zu implementieren, wenn Sie tatsächlich versuchen, sie zu verwenden.
Auch wenn Sie eine Container
implementieren, sollten Sie dennoch die Vorteile von primitiveren Container nehmen für Sie die schwere Arbeit zu tun (oder zumindest die primitive Behälter reimplementieren, so dass die schwere Arbeit in einem kleinen konsolidiert Reihe von Dienstprogrammen).
Schließlich, als stilistischer Punkt, müssen Sie nicht malloc
für einen Container verwenden. Die Standardbibliothek stellt std::allocator
zur Verfügung, die verwendet werden kann, um Platz für Objekte zuzuweisen und sie zu konstruieren.
Es heißt * Destruktor *, wie in der Zerstörung. Nicht Dekonstruktor. :) – jalf
@jalf Richtig, sorry. – Maxpm