-3

Ich war ein einfaches C++ Programm mache CTable mit - meiner eigenen Klasse. CTable enthält einen Zeiger auf ein Array von int, das mit Methoden CTable geändert und bearbeitet werden kann.Programm stürzt ab mit der Meldung „rekursiv aufgerufen terminate“ ohne jede Ausnahme zu werfen

Hier ist ein kurzer Ausschnitt:

class CTable 
{ 
private: 
    int *table; //pointer to the table 
    int length; //length of the table 
    ///...etc 
public: 
    int SetLength(int length); //returns -1 on failure 
    int SetValueAt(int index, int value); //returns -1 on failure 
    ///...etc 
    CTable& operator+=(CTable &other) //combine 2 CTables together 
    { 
     int oldLength = length; 
     SetLength(length+other.GetLength()); 
     for(int i=oldLength;i<length;i++) 
     { 
      SetValueAt(i,other.GetValueAt(i-oldLength)); 
     } 
     return *this; 
    } 
}; 

Ich habe auch eine andere Funktion, die ich verwende Benutzereingaben in Worte aufgeteilt:

vector<string>* splitString(string sentence, char delim) 
{ 
    vector<string> *res = new vector<string>(); 
    stringstream ss; 
    ss.str(sentence); 
    string word; 
    while (getline(ss,word,delim)) 
    { 
     res->push_back(word); 
    } 
    return res; 
} 

Es ist wichtig, hier vorgestellt zu beachten, dass alle Methoden scheinen um alleine gut zu funktionieren, dh wenn ich sie einzeln teste.

Wie Sie ich auch haben sehen können, überlastet die += Betreiber. Das Problem ist, dass wenn ich diesen Operator verwende, die nächste Benutzereingabe das Programm abstürzt, wenn die splitString() Funktion aufgerufen wird. Das Programm stürzt ab mit der einzigen Fehlermeldung "beenden rekursiv aufgerufen". Es gibt keine Ausnahmen, nichts. Nur ein Fehlercode 0xC0000005

Ich kann Ihnen nicht den ganzen Code wirklich zeigen, weil das Programm ziemlich groß wurde, zZ ungefähr 1000 Linien des Codes. Ich versuche dieses Programm stundenlang zu reparieren und ich habe keine Ahnung, was los ist. Jede Hilfe wird sehr geschätzt!

+0

sehe keinen Versuch catch Block, woher weißt du, dass es nicht wirft? übrigens. terminate() ist der Indikator, dass es wirft, aber Sie behandeln es nicht 'catch (...)' könnte Ihnen mit übersehenen Ausnahme-Typen helfen – deW1

+0

Ich habe versucht, einen try-catch über die gesamte Hauptfunktion und es hat nichts gefangen. – AlanKalane

+2

Sie bekommen wahrscheinlich ein unbestimmtes Verhalten. Es gibt nicht annähernd genug Code, um es zu diagnostizieren. Sie müssen den Code wahrscheinlich mit einem Debugger durchgehen, um ihn einzugrenzen. –

Antwort

2

Der Windows-Fehlercode 0xC0000005 bedeutet STATUS_ACCESS_VIOLATION. Dies wird normalerweise durch ein Problem mit Zeigern, außerplanmäßigen Array-Zugriffen, Speicherkorruption und anderen schwerwiegenden Problemen verursacht.

Die splitString() Funktion sieht ok, so dass es Ursachen sicherlich nicht von selbst die Art von Verhalten sind Sie beschreiben.

Die operator+=() sieht eher verdächtig. Der Code selbst scheint in Ordnung zu sein, aber er macht Annahmen, dass SetLength() die Länge ändert, den Zeiger neu zuordnet und alle vorhandenen Werte kopiert, alles ohne Probleme. Beachten Sie übrigens, dass dieser Code keinen speziellen Fall behandelt, wie zum Beispiel += auf einem selbst zu tun.

Leider ist die Unterzeichnung dieser Funktion int SetLength(int length);. Der Name des Parameters verbirgt also den Namen des Mitglieds length, was einige schwerwiegende Fehlanpassungen verursachen könnte, die zu Pufferüberläufen führen könnten oder das unveränderte Element length (es sei denn, Sie verwenden und length, um den Unterschied zwischen den beiden zu machen).

Schließlich verwenden Sie rohe Zeiger anstelle von Smartpointern. Sie müssen also die rule of 3 sicherstellen. Wenn Sie dies nicht tun, werden Sie mit flachen Kopien enden, die auch zu UB führen können (wenn eines der Objekte den Speicher freigibt, den seine Kopie noch verwendet).

+0

Du hattest Recht, irgendwo in der SetLength-Funktion habe ich diese-> Länge statt Länge und es verursachte alle Probleme. Danke, ich habe versucht, das stundenlang zu beheben und konnte die Ursache nicht finden. – AlanKalane

+0

@AlanKalane gute Nachrichten! Wäre es möglich, dass die Datensätze deine Frage mit dem Code von 'SetLength()' aktualisieren, bevor du sie korrigiert hast (in und edit)? Dies wäre hilfreich für zukünftige Leser mit ähnlichen Problemen. – Christophe