Ich möchte ein Array erstellen, das Zeiger auf viele Objekte enthält, aber ich weiß nicht im Voraus, wie viele Objekte ich halten werde, was bedeutet, dass ich Speicher dynamisch für das Array reservieren muss. Ich habe an den nächsten Code gedacht:
%Vor% wobei ants
als Ant **ants;
und Ant
als Klasse definiert ist.
Wird es funktionieren?
Wird es funktionieren?
Ja.
Wenn möglich, sollten Sie jedoch einen Vektor verwenden:
%Vor%Wenn Sie ein dynamisch zugewiesenes Array verwenden müssen, würde ich diese Syntax bevorzugen:
%Vor%Aber vergiss das alles. Der Code ist immer noch nicht gut, da es manuelle Speicherverwaltung erfordert. Um das zu beheben, könntest du deinen Code ändern zu:
%Vor%Und das Beste wäre einfach das:
%Vor% Müssen Sie wirklich Zeiger auf die Elemente halten? Wenn Sie Objekte nach Wert verwenden können, ist ein viel einfacherer Ansatz die Verwendung eines Vektors: std::vector<Ant> ants(num_ants);
. Dann müssen Sie nicht nur Schleifen schreiben, sondern Sie müssen sich auch keine Gedanken über Speicherlecks von unformatierten Zeigern und anderen Objekten der Objektverwaltung machen.
Wenn Sie Objektzeiger benötigen, um eine API zu erfüllen, können Sie weiterhin vector
für den äußeren Container verwenden und die Objekte manuell zuweisen.
Oder wenn Sie nicht wissen, wie viele im Voraus:
%Vor% Andererseits denke ich, dass Sie sich fragen müssen, ob
Ant
ist ein Entitätstyp oder ein Wert. Wenn es ein Wert ist, wirst du
wahrscheinlich wollen Sie die Zeiger und die dynamische Zuordnung überspringen;
Wenn es sich um einen Entitätstyp handelt, müssen Sie die Lebensdauer von betrachten
das Objekt und wann und wo es gelöscht wird.
Ja, das ist die allgemeine Idee. Es gibt jedoch Alternativen. Sind Sie sicher, dass Sie ein Array von Zeigern benötigen? Ein Array von Objekten der Klasse Ant
kann ausreichend sein. Sie müssten nur das Array zuweisen:
Im Allgemeinen sollten Sie std::vector
zur Verwendung eines Arrays verwenden. Ein Vektor kann nach Bedarf wachsen und übernimmt die Speicherverwaltung für Sie.
In dem von Ihnen geposteten Code müssten Sie jedes Element von ants
in einer Schleife löschen und dann das Array selbst löschen, delete [] ant
. Beachten Sie den Unterschied zwischen delete
und delete []
.
Ein weiterer Punkt, da die Array-Indizes in C ++ 0-basiert sind, wird die folgende Konvention verwendet, um über die Elemente zu iterieren:
%Vor%Dies macht Code viel lesbarer.
Tags und Links c++ new-operator