Erzeugen umfangreicher Objekte(Vermutlich Anfängerfrage)



  • Habe folgendes Frage.
    Hat einer mal ausprobiert,was passiert, wenn man ein paar große Objekte auf dem Stack erzeugt(sozusagen ohne new)und kein Objekt auf dem Heap erzeugt. Kann es sein das wenn der Stack voll ist, Objekte überschrieben werden und der aufruf des Konstruktors dann einen fehler erzeugt?(Speicherzugriffsfehler)
    Kann ich auf das erzeugen von Objekte durch new nicht verzeichten? 😕



  • Überschrieben wird da i.d.r nix. Was willst du denn genau wissen?



  • Also Problem ist folgendes. Habe ein lauffähiges Programm in dem ich ne ganze Menge Objekte erzeugen. Keins aber dynamisch. Nun rufe ich eine von mir programmierte Funktion auf und ich bekomme während dem Aufräumen (sprich aufruf sämtlicher Destruktoren) einen Speicherzugriffsfehler bei einem Objekt das ich in der funktion überhaupt nicht nutze. Schalte ich die Funktion ab funktioniert alles ohne Probleme. Meine Vermutung war das vielleicht Objekt schon entfernt wurde und daher dieser Fehler auftritt. Konnte mir vorstellen das die umfangreiche Funktion nicht mehr in den Stack passte?



  • soweit meine Erfahrungen reichen, schmiert das Programm einfach ab, wenn nicht mehr genug Platz auf dem Stack ist. Deshalb versuche ich nun, immer schön viel auf dem Heap auszulagern.



  • 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