Ich versuche, meinen eigenen std :: Vektor aus Gründen der Praxis zu implementieren. Aktuelle Quellcode: http://pastebin.com/bE4kjzcbWie zerstört der Vektor std :: seine Objekte?
Hier eine Übersicht meiner Klasse:
Array()
etwas Speicher zuteilen mitmalloc()
push_back(const T &t)
ein Element hinzuzufügen, rufen Sierealloc()
, falls erforderlich.~Array()
Anruffree()
, um Speicher freizugeben.
Das Hauptproblem mit diesem Modell ist, rezykliert free()
die Erinnerung, aber es nennt destructor nicht T
‚s (wenn T
eine Klasse ist eher als Standard-Datentyp).
Dies kann zu schwerwiegenden Ressourcenverlusten führen, wenn Elemente in Vektoren Objekte sind. Meine Lösung für dieses Problem ist, rufen Sie ~T()
EXPLICITLY vor ich free()
der Speicher.
Der Grund, warum ich malloc()
verwende, ist, versuche ich realloc()
zu verwenden. Wenn ich new
und delete
verwende, wird die Speicherbelegung bei der Neuzuweisung ihren Höchstwert erreichen. (Der Moment, wenn sowohl der neue Puffer als auch der alte Puffer vorhanden sind.)
Q: Ist das ein schlechtes Design? Wie funktioniert std::vector
dieses Problem zu lösen? Gibt es andere Fehler in meiner Vektorklasse?
PS: Sprechen wir jetzt nicht über Multithread-Leistungen von malloc()
.
Wenn Sie C++ verwenden, verwenden Sie nicht 'malloc' und' free', verwenden 'new'und' delete' – Omar
Wie fügen Sie Elemente in 'push_back' hinzu? Wenn Sie placement new verwenden, wäre der Aufruf des Destruktors explizit sinnvoll. – songyuanyao
Ihre Implementierung ist insgesamt nicht allzu sicher. Ihr 'push_back' interpretiert rohen nicht initialisierten Speicher als Objekt neu und weist es ihm zu. Versuchen Sie, 'std :: string' in Ihrem' Array' zu speichern und es wird sicher ein Unglück folgen. – StoryTeller