Vektor insert/push_back machen nur eine Kopie, oder??? +prüfen auf ungültigen Speicher
-
Liege ich richtig damit, dass insert bzw. push_back eines Vectors nur eine Kopie der übergebenen Variable machen???
es muss so sein, da man ein objekt ja vorher erstellt und mit push_back hinzufügt, das objekt am ende der funktion jedoch gelöscht wird:
std::vector<Thing> vec; void foo(){ Thing x; foo.push_back(x); }// x wird gelöschtdas führt mich zu einer weiteren Frage: sagen wir, ich habe mehrere Vektoren mit Zeigern. Dabei füge ich denselben Zeiger unterschiedlichen Vektoren hinzu. Somit wurden Kopien dieses Zeigers erstellt, welche auf dasselbe Objekt zeigen. Lösche ich nun das Objekt per delete auf den Pointer in dem einen Vektor, so ist der Pointer in dem anderen Vektor logischer Weise ungültig und zeigt auf etwas, was nicht mehr existiert.
nun zur Preisfrage:
wie finde ich heraus, ob ein Zeiger auf ungültigen Speicher zeigt, bevor ich ihn benutze??? oder muss ich jetzt irgendwie Liste führen???hoffe ihr könnt mir helfen!
vielen dank!
anchelito
-
nun zur Preisfrage:
wie finde ich heraus, ob ein Zeiger auf ungültigen Speicher zeigt, bevor ich ihn benutze???Garnicht. Das ist einer der Gründe, warum sich verwaltete Sprachen wie Java und C# steigender Beliebtheit erfreuen :D. Als C++-Programmierer bleibt dir nur die Möglichkeit, die Zuständigkeit für das Löschen des Objekts genau festzulegen, oder, falls dir das absolut nicht gelingt, auf Alternativen wie boost::shared_ptr auszuweichen.
Grüße
Martin
Edit: Achja, mit der Kopie im Vector hast du recht, du kannst das Originalobjekt nach dem einfügen getrost wegschmeißen, es sei denn natürlich, du speicherst nur eine Referenz oder einen Zeiger
-
das ganze klingt sowieso nach schlechtem design.
-
hallo, danke erst mal für die antworten.
das ich die gültigkeit nicht prüfen kann, habe ich leider auch schon schmerzlich herausgefunden. über boost hatte ich auch nachgedacht, aber ich hab für mein problem eine einfachere lösung gefunden.
@apfelIchTopf
das ich einen Pointer in mehreren Vektoren speichere hat einen guten Grund und passiert nicht aus Versehen. daher gehe ich nicht von schlechtem design aus
-
@anchelito:
Ich will dir jetzt nix unterstellen, ich kenne dich ja nicht (und deinen Code auch nicht). Nur ... auf die Feststellung "klingt nach schlechtem Design" mit "hat einen Grund" zu antworten... Klar denkst du es hat einen Grund, das heisst aber nicht dass es nicht trotzdem schlechtes Design sein könnte.
Die Fragen die du dir stellen solltest:
* Wann könnte der Fall eintreten dass ein Zeiger auf Objekte X gleichzeitig in vector A und vector B gespeichert ist, und dann Objekt X über den Zeiger in vector A gelöscht wird?
* Was wäre dann das richtige Verhalten, bzw. will ich das Objekt X dann überhaupt schon löschen?
* Wie kann ich dieses richtige Verhalten am besten erreichen?Der "üblichste" Fall ist denke ich dass man das Objekt garnicht löschen möchte solange noch irgendwo Zeiger existieren.
Wenn du das Objekt doch sofort löschen möchtest obwohl noch ein Zeiger darauf existiert, solltest du dich fragen wieso du überhaupt 2 vektoren von Zeigern hast.Der Tip boost::shared_ptr ist aber gut. Mit shared_ptr + weak_ptr lassen sich fast alle Fälle abdecken die ich mir so vorstellen kann.