Erzeugen umfangreicher Objekte(Vermutlich Anfängerfrage)



  • dann wird es wohl nicht am Stack liegen, wenn da nichts überschrieben wird und so ein Programm dann normalerweise abschmiert. Hat einer ne Idee was einen Speicherzugriffsfehler im Destruktor zur Laufzeit auslöst?



  • Hat einer ne Idee was einen Speicherzugriffsfehler im Destruktor zur Laufzeit auslöst?

    In unserem lieblichen C++ gibt es so ca. einhunderttausend verschiedende Möglichkeiten ein deraritges Verhalten zu produzieren.

    Und da meine Kristallkugel gerade Urlaub macht, wäre es hilfreich, wenn du etwas konkreter werden würdest.



  • Viel konkreter zu werden ist bei so einem umfangreichem Listing ziemlich schwer, ohne das ganze Listing zu posten. Ich versuchs jetzt mal. Also ich habe zwei Objekte. In Objekt a lese ich was aus ner Datei ein und gewinne Infos daraus. Objekt b verarbeitet die Infos nun und soll die ERgebniss später ausgeben. Nun übergebe ich objekt b ein Objekt a. So habe ich jetzt zugriff auf infos von a und kann sie bearbeiten. Doch wenn das Objekt zerstört werden soll schmeißt er nen Fehler. Habe bisher aber im Hauptprogramm zum Test das Objekt a erzeugt und die Methoden aus Objekt a aufgerufen(z.B. einlesen). Anschließend das Objekt an b übergeben und dann die entsprechenden Methoden aufgerufen. Dies führte zu einem Speicherzugriffsfehler beim aufräumen. Aber nur wenn ich eine Methode aufrufe die überhaupt nichts mit Objekt a zu tun hat. greift auf keine Daten und methoden zurück.

    Nun habe ich folgenden Versuch gemacht der auch zum Ziel führte. Ich habe die Methoden aus a in den Konstruktor von b gepackt. Dies funktioniert nun einwandfrei. Es stören aber mich zwei Dinge.
    Erstens ich weiß noch immer nicht wieso?? Hat einer ne Idee.
    Zweitens sind diese Methoden mit Exceptions gesichert und es ist eigentlich nicht so toll exceptions im Konstruktor zu erzeugen. Gibt es nen Weg das zu umgehen?

    Bitte HELFT mir!!!!



  • Original erstellt von bonsai:
    Dies führte zu einem Speicherzugriffsfehler beim aufräumen.

    Der Speicher auf den du zugreifst, liegt der jetzt auf dem Heap oder auf dem Stack??? Bei ersterem sind meistens doppelte deletes und deletes auf Nirvana-Pointer die Ursache. Bei zweiterem dürfte es keine Zugríffsfehler geben, ausser du hast noch Pointer auf die Objekte nachdem sie zerstört sind...



  • Das ganze sollte auf dem Stack liegen, da ich keinen Speicher allokiert habe mit new. Tja und das da Theoretisch kein Fehler auftreten soll weiß ich auch aber leider gibt es bei mir einen. Ich räume auch nicht von Hand auf. War vielleicht falsch formuliert. Wenn das Programm nach abarbeitung aller Methoden die Destruktoren aufruft kommt dieser Fehler an einer Stell wo halt der Destruktor von Objekt a aufgerufen werden sollte



  • Achso und pointer habe ich auch keine auf die objekte



  • ohne code zu sehen kann man das problem nicht loesen (es sei denn man kann gut raten)

    kuerze den code soweit dass es minimaler nicht mehr geht, aber der fehler immer noch da ist.

    meistens entdeckst du den fehler dann schon beim kuerzen...



  • Original erstellt von bonsai:
    **

    ...während dem Aufräumen (sprich aufruf sämtlicher Destruktoren) einen ...**

    Wer ruft die Destructoren auf ???

    Falls Du das mit delete machst, isses klar!

    Statisch erzeugte Objekte werden (soweit ich das kenne) automatisch vernichted, wenn Gueltigkeitsbereich der Variable verlassen wird! ein weiteres delete fuehrt zu Fehler - das Objekt ist schon ungueltig!



  • Nö passiert beim automatischen Aufruf der Destruktoren nach dem das Programm abgelaufen ist. Habe bloß die Destruktoren für dei Fehlersuche mit Ausgaben gefüttert damit ich weiß woher der fehler kommt. Versuche dann erstmal das programm so weit zu kürzen und dann mal zu posten



  • dämlicherweise funktioniert das programm nach dem kürzen des programms ohne probleme wieder. Konnte aber nicht rausfinden woran es lag. Habe ein wenig schiß das das Programm später eim bearbeiten großer Dateien abschmiert.
    Mir wurde jetzt von nem bekannten gesagt das ich bei Objekten immer Speicher allokieren muß.
    Versuche es also mal mit folgender Frage.
    Ich habe mehrere vektoren die als Typ Objekte enthalten. werden diese Objekte dann auf dem Heap angelegt? Entfällt somit für mich das speicher allokieren?
    Wenn nicht wie mache ich das dann bei nem Vektor? Oh und noch so nebenbei. Kann ich vektoren einer funktion übergeben und wenn ja wie?
    Fragen über Fragen ich weiß:-))


Anmelden zum Antworten