seltsamer Programmabbruch



  • Hallo,

    ich habe eine Win32 Konsolenanwendung, in der ich ein Menü aufgebaut habe. Jedes Untermenü wird durch eine neue Methode realisiert. Durch das Menü kann man sich frei vorwärts und rückwärts bewegen. Die Methoden rufen sich also gegenseitig auf. Am Anfang des Programms wird ein Dateiname abgefragt. Aus der Datei werden Informationen gelesen, mit denen ein Semantisches Netz aufgebaut wird. Alternativ kann auch ein neues Netz aufgebaut und eine neue Datei angelegt werden. Das Semantische Netz habe ich in diversen Klasse definiert.

    Wenn ich eine Datei einlese und das Netz aufbaue, klappt soweit alles wunderbar. Alle Informationen stimmen und ich kann weiterarbeiten und neu in die Datei schreiben. Wenn ich aber den Startbildschirm aufrufen möchte, dann bekomme ich einen Programmabbruch mit folgender Fehlermeldung:

    **Debug Assertion failed!

    Program: ...
    File dbgheap.c
    Line: 1011

    Expression: _CrtIsValidHeapPointer(pUserData)**

    Ich habe dann die Auswahl zwischen Abort, Retry und Ignore.

    Hier zur Info noch die Struktur meiner Methode, in der ich das Netz lade

    bool netz_oeffnen(SemanticNet& netz, const string& pfad){
     is.open(pfad.c_string()); //ifstream is; bereits global definiert
     if (!is){
      return false;
     }
     int bezeichner; //als ID für die auszuführende Methode um das Netz korrekt zu rekonstruieren
     while (true){
      if (!is.read((char*)&bezeichner, sizeof(int)){
       break;
      }
      switch (bezeichner){
       case 100: //es werden die benötigten Daten eingelesen, um eine Adresse zu erstellen
         Adressen ad(...);
         netz.adresse_hinzufuegen(ad);
         break;
    
       case 110: //usw.
      }
     }
     return true;
    }
    

    Wer kann mir bitte diese Fehlermeldung erklären und kann mir vielleicht einen Hinweis geben, wo bzw. wonach ich in meinem Programm suchen muss? (Mein Menü hat mehr als 3600 Zeilen)

    Vielen Dank!

    Basti



  • der Fehler ist nicht merkwürdig, sondern irgend wo scheitert ein assert. Woran und wo der Fehler liegt wird dir doch sogar erklärt. Wo ist das Problem?

    Du übergibst irgend wo einen Pointer, der aber nicht auf den Heap zeigt, sondern vermutlich auf den Stack.



  • Das Problem besteht darin, dass ich eigentlich nirgends Pointer übergebe. Ich übergebe lediglich mit jedem Aufruf eine Referenz des anfangs erstellten Netzes, so dass alle Änderungen in demselben Netz vorgenommen werden. Dazu übergebe ich ab und zu noch weitere Variablen, die ich für meine Funktionen benötige. Ich verstehe auch ehrlich gesagt nicht, warum das ausgerechnet nur passiert, wenn ich die Methode netz_oeffnen() aufrufe. Hat das irgendetwas mit der Art, wie ich die Daten einlese zu tun?

    Auszug aus der Methode netz_oeffnen():

    bool netz_oeffnen(SemanticNet& netz, const string& pfad){
      is.open(pfad.c_str());
      int bezeichner;	//Zum Identifizieren der auszuführenden Methode
      string name, vorname, adstatus, email, titel, dokstatus, dateipfad;
      int pos, pos2, vorwahl, telnr, jahr, monat, tag, stunde, minute, dauer;
      if (!is){
        return false;
      }
      //Einlesen der Daten und Aufbau des Netzes
      while (true){
        if (!is.read((char*)&bezeichner, sizeof(int))){
          break;
        }
      switch (bezeichner){
       case 100:	//Alle Methoden für Adressen
         getline(is, name, '\0');
         getline(is, vorname, '\0');
         getline(is, adstatus, '\0');
         getline(is, email, '\0');
         is.read((char*)&vorwahl, sizeof(int));
         is.read((char*)&telnr, sizeof(int));
         {
         Adressen ad(name, vorname, adstatus, email, vorwahl, telnr);
         netz.adresse_hinzufuegen(ad);
         }
         break;
       case 200:     //usw.
      }
      return true;
    }
    

    Ich muss ja die Erstellung der Adresse in dem Case-Block in einen Anweisungsblock packen, damit die Adresse nur lokal definiert bleibt. Wenn ich die Methode also verlasse, sucht er dann vergeblich nach der Adresse, weil sie bereits gelöscht wurde? Oder bleibt diese Adresse im Heap erhalten, weil ich sie ja zum Netz hinzugefügt habe und das Netz nur eine Referenz ist?


Anmelden zum Antworten