Frage zu Vektor und Pointer
-
Hallo alle,
Mein Problem ist Folgendes:
Ich haben mehrere Elemente in einem Vector und einen Iterator Iter.
Im Moment benutze ich
MeineKl *eins=&(*Iter);um einen Pointer auf eines dieser Elemnte zu bekommen.
Also
1.gibt es eine bessere/schönere/einfachere Methode um diesen Pointer zu erlangen
und
2.wie kann ich herausfinden, ob das objekt auf das er zeigt noch gültig ist, beziehungsweise nicht gelöscht wurde (wenn es so ist müsste es doch beim Zugriff einen Segmantation Fault geben oder??)Danke für alle Antworten

-
Hi,
ich würde das gar nicht machen, eben weil es keine Möglichkeit gibt, herauszufinden, wie lange das Objekt tatsächlich noch da liegt.
Außerdem braucht's das gar nicht: Mit dem Iterator kannst Du alles machen, was Du mit einem Pointer machen möchtest....Ob es einen SegFault beim Zugriff auf eine ungültige Speicherstelle gibt oder nicht, kann keiner inder Allgemeinheit sagen. Hängt u.a. ab, was da inzwischen liegt und wie das Betriebssystem mit sowas umgeht. Ein SegFault bedeutet sogar Glück in so einer Situation ... besser, als wenn das Programm erstmal weitermacht und dann die ISS abstürzt.

Gruß,
Simon2.
-
Danke schön für die schnelle antwort

-
Fencer schrieb:
1.gibt es eine bessere/schönere/einfachere Methode um diesen Pointer zu erlangen
Nicht wirklich. Ich würde die Klammern weglassen, aber das wars dann auch schon. Bei manchen Implementierungen ist vector<T>::iterator schon ein Pointer, aber es ist offensichtlich nicht sehr gentleman-like, sich darauf zu verlassen.
2.wie kann ich herausfinden, ob das objekt auf das er zeigt noch gültig ist, beziehungsweise nicht gelöscht wurde (wenn es so ist müsste es doch beim Zugriff einen Segmantation Fault geben oder??)
Leider gar nicht. Du musst selbst dafür sorgen, dass du keine Operationen auf dem Vektor ausführst, die den Pointer invalidieren. Welche das sind, ist im Standard genau spezifiziert. Man kann sich das aber auch selbst denken ... alles was mit Verschieben zu tun hat, ist schon mal heikel, Neuallokationen (bei push_back über die reservierte Größe hinweg) invalidieren sofort alle Iteratoren und Pointer.
Wenn du einen Container brauchst, bei dem sowas nicht passiert, solltest du vielleicht list benutzen.