000
04.08.2005, 16:19 Uhr
JazzMC
|
Falls diese Frage schon irgendwo beantwortet wird oder ihr einen tollen Link wisst, sagts ruhig damit :-)
Es geht um folgendes.
Ich schreibe an einem kleinen Programm für meine Diplomarbeit (Kantenfärbungen im vollständigen Graphen und lokale Suche), in dem Vektoren benutzt werden. Leider ereignet sich auch nach sorgfältigster Bug-Suche ein Fehler, der darauf zurückzuführen sein muss, nach allem, was ich mir an Testausgaben habe machen lassen, dass der Inhalt von Vektoren teilweise unsinnvollerweise überschrieben wird.
Der Vektor, in dem das passiert, wird ohn Größenangabe deklariert, also vector<int> wasauchimmer; und danach werden je nach Bedarf durch push_back() bzw. delete() Elemente eingefügt bzw. gelöscht. Das deswegen, weil ich die genaue Größe vorher nicht weiß und selbige auch variieren kann.
Soweit ich an verschiedener Stelle gelesen habe, verwalten diese Methoden automatisch den nötigen Speicher. Durch das Hinzufügen und Löschen kann es ja rein theoretisch sein, dass, wenn inzwischen im Speicher auch andere Datenobjekte angelegt wurden, die Speicherbausteine für einen Vektor nicht mehr alle hintereinander ohne Lücke liegen.
Meine Frage ganz genau: Wenn so etwas passiert, ist es dann ausgeschlossen, dass DADURCH Teile von Vektoren überschrieben werden, oder muss man, um so etwas vorzubeugen, Vektoren IMMER nach dem Schema vector<int> (CONST GROESSE); deklarieren?
Oder anders formuliert: ich habe den Code so lange nach möglichen falschen Indexbenutzungen (z.B. Vektor hat nur 8 Ints als Inhalt, aber ein Index greift auf vector[12] zurück) durchsucht, dass ich langsam den Eindruck gewinne, dass ich die Funktionsweise der Vektoren an sich vielleicht nicht richtig verstanden habe und das Ganze deswegen immer irgendwann durch eine Speicherfehlbelegung (inhaltlicher Art) abstürzt.
Und noch einmal anders: wenn die einzelnen Speicherbelegungen eines Vektors nicht mehr alle hintereinander, in Reih und Glied gewissermaßen liegen, kann das zu Fehlern führen, weil die Zugriffe vector[0], vector[1], vector[2], ... vector[n] immer auf aufeinander folgende Speicherelemente zugreifen, weil angenommen wird, dass diese immer so angeordnet sind?
Ganz übergeordnet: merkt sich die Programmverwaltung alle einzelnen Speicheradressen eines Vektors, auch wenn sie nicht aufeinanderfolgen, und achtet darauf, dass diese NICHT von anderen Datenobjekten belegt werden? Und wenn ich vector.clear(); ausführe, dann andere Datenobjekte anlege, und dann durch die push_back()-Methode diesen eben geleerten Vektor wieder anfange zu füllen, wird dann wieder auf die vorher benutzten Speichereinheiten (der Vektors, bevor er geleert wurde) gespeichert, die ja jetzt rein theoretisch durch die neuen Datenobjekte belegt sein könnten (der Speicher wurde ja freigegeben), oder weiß die Programmverwaltung, dass dieser Speicher inzwischen zum Teil von anderen Variablen belegt wurde und weist dem gleichen Vektor neuen Speicher zu, wenn er wieder aufgefüllt wird?
Ziemlich lange Fragerei, ich weiß, aber ich habe über die Jahre festgestellt, dass es ganz sinnvoll sein kann, eine Frage auf verschiedene Arten und Weisen zu stellen, weil unterschiedliche Menschen ein Problem auf unterschiedliche Weise begreifen, und nur dann wirklich gute Antworten geben können, wenn die Problembeschreibung ihrer Auffassung von selbigem gleicht. So ging es mir immer in Physik ;-)
Ich hoffe, irgendjemand kennt die C++ Innereien so gut, dass er mich erleuchten kann. Langsam verzweifle ich nämlich an diesen vielleicht 200 Zeilen Code. Die kann ich auch gerne bei Bedarf hier reinkopieren, aber ich denke, dass die Frage erstmal spezifisch genug ohne ihn ist.
Cheers,
Jan. |