Was passiert, wenn ein Objekt seinen eigenen Container ändert?

8

Das ist keine Frage, warum Sie Code wie diesen schreiben würden, sondern eher eine Frage darüber, wie eine Methode in Bezug auf das Objekt ausgeführt wird, mit dem sie verbunden ist.

Wenn ich eine Struktur wie:

habe %Vor%

Und ich benutze es so:

%Vor%

Was passiert, wenn der push_back(...) in doSomething(...) den Vektor expandiert? Dies bedeutet, dass vec[0] kopiert und dann mitten in der Ausführung der Methode gelöscht wird. Das wäre nicht gut.

Könnte jemand erklären, was genau hier passiert?

  • Stürzt das Programm sofort ab? Versucht die Methode, mit Daten zu arbeiten, die nicht existieren?
  • Arbeitet die Methode "verwaist" mit ihrem Objekt, bis sie auf ein Problem wie den Zustand des Objekts reagiert?

Ich bin daran interessiert, wie ein Methodenaufruf auf das zugehörige Objekt bezogen ist.

    
user487100 02.08.2013, 15:25
quelle

2 Antworten

7

Ja, es ist schlecht. Es ist möglich, dass Ihr Objekt kopiert wird (oder in C ++ 11 verschoben wird, wenn die Unterscheidung für Ihren Code relevant ist), während Sie in doSomething () sind. Nach dem Zurückgeben von push_back () zeigt der this-Zeiger möglicherweise nicht mehr auf den Speicherort Ihres Objekts. Für den speziellen Fall von vector :: push_back () ist es möglich, dass der Speicher, auf den gezeigt wird, freigegeben wurde und die Daten an anderer Stelle in ein neues Array kopiert wurden. Bei anderen Containern (zum Beispiel einer Liste), die ihre Elemente an Ort und Stelle belassen, wird dies (wahrscheinlich) überhaupt keine Probleme verursachen.

In der Praxis ist es unwahrscheinlich, dass Ihr Code sofort abstürzt. Der wahrscheinlichste Umstand ist ein Schreiben in den freien Speicher und eine stille Verfälschung des Zustands Ihres F-Objekts. Sie können Tools wie Valgrind verwenden, um diese Art von Verhalten zu erkennen.

Aber im Grunde haben Sie die richtige Idee: Tun Sie das nicht, es ist nicht sicher.

    
Andy Ross 02.08.2013, 15:30
quelle
3
  

Könnte jemand erklären, was genau hier passiert?

Ja. Wenn Sie auf das Objekt zugreifen, nachdem ein push_back , resize oder insert den Inhalt von vector neu zugewiesen hat, ist das Verhalten nicht definiert, was eigentlich bedeutet Es kommt auf deinen Compiler an, auf dein OS, was do some more stuff ist und vielleicht auf eine Reihe anderer Faktoren wie Mondphase, Luftfeuchtigkeit in einiger Entfernung, ... du nennst es; -)

Kurz gesagt, dies ist (indirekt über die std::vector Implementierung) Aufruf des Destruktors des Objekts selbst, so dass die Lebensdauer des Objekts beendet ist. Außerdem wurde der zuvor vom Objekt belegte Speicher durch den Zuordner vector freigegeben. Daher führt die Verwendung der nicht statischen Elemente des Objekts zu undefiniertem Verhalten, da der an die Funktion übergebene this -Zeiger nicht mehr auf ein Objekt zeigt. Sie können jedoch statische Mitglieder der Klasse aufrufen / aufrufen:

%Vor%     
Arne Mertz 02.08.2013 15:48
quelle

Tags und Links