Bei Aufruf von new wird das Programm beendet



  • GolanT schrieb:

    Dann erkläre mir bitte "kaputter Heap". Wie soll ich da was kaputt machen, wenn ich einen Char-Zeiger anlege und mit diesem zur Laufzeit ein Char-Array erzeuge. Das Programm endet ja immer, beim anlegen des Arrays.

    Das mag sein das es erst dort abstürzt, wenn du aber vorher schon wild mit Zeigern um dich schießt und dir ggf. den Aufrufstack oder ähnliches durcheinander bringst kann auch ein solches Verhalten eintreten.

    Aber mit den paar Information die du bislang rausgerückt hast, kommt mir eine Fehlersuche in etwa genauso schwer vor wie als ob man eine Arztdiagnose über ein Foto haben will (Und nur wenige Krankheiten lassen sich so eingrenzen)...

    Entweder du willst mit deinem Problem alleine bleiben, oder wir benötigen mehr "Input" (z.B. mehr Code) oder du versuchst schlicht und ergreifend erstmal das was schon vorgeschlagen wurde: Ausdokumentieren und nach und nach wieder aktivieren um den Fehler besser einzugrenzen.

    cu André



  • Nunja, es gilt immernoch: wenn du geizig mit deinem Code bleibst und uns nicht etwas mehr Kontext gibst (aus dem aktuellen kann man keine Fehlerursache erkennen) bleibt uns nur, ins Blaue zu raten (Vielleicht hat jemand an deinem Compiler rumgespielt und unter ganz bestimten Bedingungen new mit[] exit ersetzt, man kann ja nie wissen).
    Wie schon gesagt wurde, wenn du wirklich Hilfe suchst, ist es am Besten, wenn du deinen Code so weit wie moeglich reduzierst, so dass er aber trotzdem das Problem noch reproduzieren kann. Dann kannst du ihn hier posten, die Rahmenbedingungen angeben (Compiler, Plattform, beutzte Eingabe/Dateien etc.), und wir koennen schauen ob sich das Problem bei usn reproduzieren laesst udn evtl rausfinden wo der Fehler steckt.



  • Natürlich bin ich für jede Hilfe offen. Deswegen bin ich ja hier.
    Okay, ich werd mal versuchen den Code hoch zu laden und gebe euch dann den Link.

    Bis gleich



  • Okay, der Code ist oben.
    Im Ordner ist noch eine kleine Infodatei zum Thema Compiler, Programmaufruf, etc.
    Hier der Link: http://hometown.aol.de/BerlinHunters/index.htm



  • Ich konnte deine Beobachtungen bei mir nachvollziehen. Mit version1 und version2 funktionierts, mit version1ESB und version2ESB nicht. Einen Fehler bei dem du recht früh in unerlaubte Speicherbereiche schreibst habe ich recht schnell gefunden. Nachdem ich ihn behoben habe lief das Programm auch mit version1ESB und version2ESB korrekt zu Ende. Es geht um die markierten Stellen.

    char* createFilenameTXT(string &file){
          string txtfile, txt = ".txt";
          int namesize;
          char* txtfilename;
    
          txtfile=file;
          txtfile.append(txt);
          namesize=txtfile.length();
          txtfilename=new char[namesize + 1]; // <-- hier + 1
          for(int i=0; i<namesize; i++){
             txtfilename[i]=txtfile[i];
          }//end for
          txtfilename[namesize]='\0'; // <-- sonst schreibst du hier über den bereich hinaus
          return txtfilename;
    }//end createFilenameTXT
    
    char* createFilenameREC(string &file){
          string recfile, rec = ".srec";
          int namesize;
          char* recfilename;
    
          recfile=file;
          recfile.append(rec);
          namesize=recfile.length();
          recfilename=new char[namesize + 1]; // <-- hier das selbe
          for(int i=0; i<namesize; i++){
             recfilename[i]=recfile[i];
          }//end for
          recfilename[namesize]='\0'; // <-- und hier auch wieder
          return recfilename;
    }//end createFilenameREC
    


  • (EDIT: Mein Post bezieht sicch auf GolanT)

    😮 😮 😮
    Also mit Deinem "create-"Zeug produzierst Du auch Speicherlecks, dass es einen gruselt....

    Sorry, warum machst Du das nicht einfach, richtig und sicher mit std::string ?

    Wenn Du ".txt" anängen willst, geht das einfach mit:

    string file1 = argv[1], file2 = argv[2];
        file1 += ".txt";
        file2 += ".txt";
    
        ifstream oldVerTxt(file1.c_str());
    ...
    

    Ich habe mir nur mal den Anfang angesehen, bin aber überzeugt, dass Du da noch eine Menge mehr drin hast.
    Versuche doch einfach mal die Regel: "Immer wenn Du "Zeichenketten" verwenden möchtest, nimm std::string ! (Für "char const*"-Schnittstellen gibt es c_str())

    Du wirst Dir ziemlich sicher mit dem char*-Gefrickel eine Menge Fehler drinhaben.

    Gruß,

    Simon2.



  • Ja... die Strings... Mit denen habe ich mich nur am Rande beschäftigt... *schäm*
    Aber wie ich die "+1" vergessen konnte... *doppelschäm*
    Danke OhneName.
    Das mit den Strings mache ich dann wohl mal lieber noch.


  • Mod

    ich hab das ganze mal durch die visual c++ 2008 beta gejagt:

    1. Es gibt weder <fstream.h> noch <iostream.h>
    benutze <fstream> und <iostream>

    Functionparser::Functionparser(int size); wird in functionsparser.cc ohne Definition redeklariert (zeile 11) - das ist unzulässig
    analog für
    Functions::Functions(const unsigned int address, const int sz, char* &buffer, int topIndex, const int counter); in functions.cc/10
    Functions::Functions(const unsigned int address, const int sz, char* name, const int namesize); in functions.cc/12
    Parser::Parser(int size); in parser.cc/13
    Parser::~Parser(); // parser.cc/15
    Vectorparser::Vectorparser(int size); in vektorparser.cc/11
    Vectors::Vectors(const unsigned int address, const int sz, char* &buffer, int topIndex, const int counter); in vectors.cc/10
    Vectors::Vectors(const unsigned int address, const int sz, char* name, const int namesize); in vectors.cc/12

    Grundsätzlich dürfen Member außerhalb der Klassendefinition nur deklariert werden, um sie gleichzeitig zu definieren.

    Zudem erhalte ich 133 warnungen, von denen mindestens die Hälfte kritisch sein dürfte (Benutzung nichtinitialisierter Variablen, Funktionen, die nicht in jedem Falle mit einem return enden). Die Heuristik des Compilers ist da nicht perfekt, aber für gewöhnlich irrt er sich in weniger als 1/1000 der Fälle.
    Auch g++ besitzt im Übrigen auch derartige Warnungen, und man sollte sie nicht ignorieren oder abschalten.

    Nicht zuletzt sieht das alles wie C aus. Es ist äußerst unsinnig (abgesehen von einigen Ausnahmen, die die Regel nur bestätigen), Variablen zu definieren, bevor sie sinnvoll initialisiert werden können.



  • Die Warnungen sind an und kommen auch. Aber nur wegen den antiquierten Headern (.h), die es im Übrigen sehr wohl gibt. Ich habe auch versucht ".h" zu vermeiden, dann hat Dev-cpp aber meine selbst erstellten Header nicht genommen.
    Was die unbenutzten Funktionen und Variablen betrifft... Das Programm befindet sich an einigen Stellen noch in Arbeit (sind aber "noch" keine wesentlichen Stellen).



  • Also ich hab mir jetzt auch den Rest des Programms noch angesehen. So weit ich das überblicken konnte gibt es keine weiteren Bereichsüberschreitungen, aber ich garantiere da für nichts, da der Code an vielen Stellen einfach nur grausig ist.

    Die Header mit .h sind wie Camper schon sagte veraltet, verwende die neuen ohne .h. Du musst halt dann überall std:: hinschreiben bzw. using verwenden.

    Du verwendest recht häufig new, aber ich habe im gesamten Programm nur ein einziges delete gefunden. D.h. du hast massenweise Speicherlecks. Wie schon gesagt wurde verwende lieber std::string statt char-arrays. Außerdem solltest du die Container der STL statt einfacher Arrays verwenden. Und wenn du trotzdem noch wo new brauchst, dann verwende Smartpointer, die kümmern sich von selbst darum dass der Speicher wieder freigegeben wird.

    Weiterhin frage ich mich warum du überhaupt Klassen verwendest, wenn kaum eine davon Attribute hat (mal abgesehen von den paar static Variablen). Da kannst du die Klassen genausogut weglassen und mit normalen Funktionen arbeiten.

    Ich hoffe für dich, dass du den Code nicht in ein paar Jahren noch erweitern musst, denn ich bin mir sicher du wirst in deinem eigenen Code nicht mehr durchblicken. Falls doch, dann solltest du ihn besser jetzt nochmal gründlich überarbeiten solange du noch weißt was er tut.


  • Mod

    GolanT schrieb:

    Die Warnungen sind an und kommen auch. Aber nur wegen den antiquierten Headern (.h), die es im Übrigen sehr wohl gibt. Ich habe auch versucht ".h" zu vermeiden, dann hat Dev-cpp aber meine selbst erstellten Header nicht genommen.
    Was die unbenutzten Funktionen und Variablen betrifft... Das Programm befindet sich an einigen Stellen noch in Arbeit (sind aber "noch" keine wesentlichen Stellen).

    <iostream.h> und <fstream.h> gibt es nur - wenn es sie gibt - um Kompatibilität für Uraltprogramme zu bieten. Für ein in Entwicklung befindliches Programm sollten sie allemal tabu sein. Natürlich befinden sich alle Deklarationen der Standardbibliothek im Namensraum std - demzufolge benötigst du tatsächlich einige zusätzlich using-Deklarationen bzw. Direktiven oder qualifizierte Namen. Das sollte aber bekannt sein und ist dem Grunde nach trivial durchzuführen.

    2.Ich rede *nicht* von unbenutzten Variablen, sondern von solchen, die benutzt und nicht initialisiert werden. Zugegebn kann ich nicht auf einen Blick erkennen, welche Funktionen benutzt werden, und welche nicht. Allerdings sind die Warnungen über alle Dateien verstreut - das indiziert, dass das Problem nicht nur in unbenutztem Code existiert.



  • Okay, ich werde dran arbeiten. Ist halt mein erstes Projekt. Man lernt ja nie aus.
    War's wohl doch der Heap (unter anderem). Der wettkönig darf sein Bein behalten 😉
    Ich werd den Code mal wieder aus dem Netz nehmen.

    Danke an alle!


Anmelden zum Antworten