Verwalten von Umfang und Objektlebensdauer innerhalb von STL-Vektoren

8

Da ich aus einer C # -Welt komme, bemühe ich mich, dafür zu sorgen, dass ich in einem C ++ - Projekt, dem ich zugewiesen wurde, keine Speicherlecks und Fehler einführe. Ich schreibe Code, der Strukturen verwendet, um Informationen aus einem Datenpuffer zu analysieren. Da die Anzahl der Datenstrukturen, die im Puffer angezeigt werden, zur Laufzeit variieren kann, wird ein stl-Vektor verwendet, um die verarbeiteten Daten zu speichern. Ich bin in der vorhandenen Software auf den folgenden Code-Block gestoßen und habe Mühe zu verstehen, warum das funktioniert:

%Vor%

Meine Fragen sind speziell:

  1. Nach diese Frage , würde nicht parserObject den Gültigkeitsbereich jeder Iteration überschreiten, da das Schlüsselwort new nicht verwendet wird? Offensichtlich hat dieser Code funktioniert.

  2. Bleibt das Objekt in vector in diesem Fall parserObject im Gültigkeitsbereich?

  3. Nach diese Frage , das ParserObject wird kopiert. Wenn dies der Fall ist, was sind die Auswirkungen auf die Leistung (z. B. Speicherverbrauch, Speicherzuweisung usw.) davon? Nehmen die kopierten ParserObjects dann den gleichen Gültigkeitsbereich an wie der Vektor?

Danke für jede Hilfe.

    
bporter 24.08.2011, 18:38
quelle

2 Antworten

7
  1. Ja, die Instanz von parserObject , die in der for -Schleife deklariert wird, geht bei jeder Wiederholung der Schleife aus dem Gültigkeitsbereich.

  2. Nein, wenn Sie parserObject in vector platzieren, wird dieses Objekt nicht im Gültigkeitsbereich gehalten. Die push_back() -Methode erstellt eine Kopie des Objekts, das jetzt dem vector gehört. Sie müssen sicherstellen, dass Ihre Objekte ordnungsgemäß kopiert werden können (Copy-Konstruktor und Zuweisungsoperator können erforderlich sein). Kopien, die in diesem Beispiel in dem Vektor enthalten sind, gehören dem Vektor und haben Objektlebensdauern, die dem vector selbst ähnlich sind.

  3. Der paserObject wird kopiert, was sich auf die Speichernutzung und -leistung auswirken kann. Wenn parserObject nicht einfach zu kopieren ist, kann dies eine teure Operation sein. Dies hängt vollständig von Ihrer Implementierung von parserObject ab.

Chad 24.08.2011, 18:45
quelle
4
%Vor%

push_back erstellt eine Kopie des Objekts und speichert es.

Stellen Sie also sicher, dass Sie den Kopierkonstruktor (und die Kopierzuweisung) für die Klasse MyParserObject richtig definiert haben, wenn er Zeiger -Member hat. Oder der vom Compiler generierte Standardcode wäre ausreichend, vorausgesetzt, jedes Mitglied von MyParserObject folgt demselben Muster (dh sie haben den Copy-Constructor (und die Copy-Zuweisung) richtig definiert, wenn sie Pointer-Member oder Standard haben - Vom Compiler generierter Code wäre ausreichend, vorausgesetzt ... und so weiter.)

    
Nawaz 24.08.2011 18:41
quelle

Tags und Links