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:
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.
Bleibt das Objekt in vector
in diesem Fall parserObject
im Gültigkeitsbereich?
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.
Ja, die Instanz von parserObject
, die in der for
-Schleife deklariert wird, geht bei jeder Wiederholung der Schleife aus dem Gültigkeitsbereich.
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.
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.
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.)