Laufzeitfehler: Fehlermeldung Windows found a Breakpoint



  • Folgender Auszug aus meinem Programm. (Ist ein kleines Multiplayergame basierend auf einer MySQL Datenbank)

    char *qry = "SELECT x,y FROM tabelle WHERE user = '";
    	char *update = "UPDATE tabelle SET ";
    	char *temps;                
    
    ...
    
    		// Bewegunsroutine v1
    
    		temps = new char[sizeof(qry)+benutzercl.size()+1];
    		strcpy(temps,qry);
    		strcat(temps,benutzercl.c_str());
    		strcat(temps,"'");
    
    		mysql_real_query(my,temps,strlen(temps));
    		results = mysql_store_result(my);
    		row = mysql_fetch_row(results);
    		delete [] temps;
    
    		ax = atoi(row[0]);
    		ay = atoi(row[1]);
    
    		if(_kbhit) {
    			eingabe = getch();
    		}
    
    		if(eingabe == 'w' || eingabe == 's') {
    
    			temps = new char[sizeof(update)+4+sizeof(row[0])+15+benutzercl.size()+1];
    			strcpy(temps,update);
    			strcat(temps,"y = '");
    
    			if(eingabe == 'w') {
    					ay++;
    			}
    			if(eingabe == 's') {
    					ay--;
    			}
    
    			itoa(ay,row[0],10);
    			strcat(temps,row[0]);
    
    		} 
    		if(eingabe == 'a' || eingabe == 'd') {
    
    			temps = new char[sizeof(update)+4+sizeof(row[1])+15+benutzercl.size()+1];
    			strcpy(temps,update);
    			strcat(temps,"x = '");
    
    			if(eingabe == 'a') {
    					ax++;
    			}
    			if(eingabe == 'd') {
    					ax--;
    			}
    
    			itoa(ax,row[1],10);
    			strcat(temps,row[1]);
    
    		}
    
    		strcat(temps,"' WHERE user = '");
    		strcat(temps,benutzercl.c_str());
    		strcat(temps,"'");
    
    		mysql_real_query(my,temps,strlen(temps));
    		delete [] temps;
    

    Das Problem liegt hier bei den delete-Operatoren. Ich bin das Programm mit dem Debugger durchlaufen und immer gleich nach dem

    delete [] temps;
    

    Gibts eine Fehlermeldung zur Laufzeit:

    Windows has triggered a breakpoint in spiel.exe

    This may be due to a corruption of the heap, which indicates a bug in spiel.exe or any of the DLLs it has loaded.

    This may also be due to the user pressing F12 while spiel.exe has focus.

    The output window may have more diagnostic information.

    Danke schon einmal im voraus!



  • 1. wieso - benutzt - du - C-Strings ? Das dann Probleme mit Speicherverwaltung aufkommen, ist doch vorprogrammiert 😃 ;



  • update und qry sind keine Arrays, sondern Zeiger - und da liefert sizeof() nicht den Wert, den du erwartest. Dadurch reservierst du weniger Speicher als zu eigentlich benötigst - und zerstörst dann bei den strcpy()-Aufrufen vermutlich wichtige Verwaltungsinformationen der Heap-Verwaltung. Wenn du die Länge der Strings wissen willst, brauchst du strlen().

    Oder noch besser: Du verwendest gleich std::string anstelle mit nackten char-Zeigern zu hantieren.



  • Danke für die schnelle Antwort 🙂

    Ich werde dann Morgen noch mal alles auf std::string umschreiben. Schaff ich jetzt bzw heute leider nicht mehr. Werde dann aber auch hier nochmal meinen Erfahrungsbericht reinschreiben damit andere die das gleiche Problem haben eine Lösung sehen.

    Grüße



  • Nur rein aus Neugier: lernst du nur C oder C/C++? Ich hoffe nicht C++, denn dieser Beitrag gehört schon in das C-Forum.



  • nach "dem" delete [] temps?
    Ich seh da zwei (Zeile 17 und 66).

    Was CStoll gesagt hat ist wohl hauptsächlich das Problem, allerdings würds dir auch explodieren, wenn die Eingabe nicht w a s oder d ist. Kleiner fix dafür:

    char *qry = "SELECT x,y FROM tabelle WHERE user = '";
        char *update = "UPDATE tabelle SET ";
        char *temps;                
    
    ...
    
            // Bewegunsroutine v1
    
            temps = new char[sizeof(qry)+benutzercl.size()+1];
            strcpy(temps,qry);
            strcat(temps,benutzercl.c_str());
            strcat(temps,"'");
    
            mysql_real_query(my,temps,strlen(temps));
            results = mysql_store_result(my);
            row = mysql_fetch_row(results);
            delete [] temps;
    
            ax = atoi(row[0]);
            ay = atoi(row[1]);
    
            if(_kbhit) {
                eingabe = getch();
            }
    
            if(eingabe == 'w' || eingabe == 's') {
    
                temps = new char[sizeof(update)+4+sizeof(row[0])+15+benutzercl.size()+1];
                strcpy(temps,update);
                strcat(temps,"y = '");
    
                if(eingabe == 'w') {
                        ay++;
                }
                if(eingabe == 's') {
                        ay--;
                }
    
                itoa(ay,row[0],10);
                strcat(temps,row[0]);
    
            } else if(eingabe == 'a' || eingabe == 'd') {
    
                temps = new char[sizeof(update)+4+sizeof(row[1])+15+benutzercl.size()+1];
                strcpy(temps,update);
                strcat(temps,"x = '");
    
                if(eingabe == 'a') {
                        ax++;
                }
                if(eingabe == 'd') {
                        ax--;
                }
    
                itoa(ax,row[1],10);
                strcat(temps,row[1]);
    
            } else {
                return; //musst dir eventuell überlegen, was du in einem solchen fall machen solltest, auf jedenfall NICHT weiter den code ausführen.
            }
    
            strcat(temps,"' WHERE user = '");
            strcat(temps,benutzercl.c_str());
            strcat(temps,"'");
    
            mysql_real_query(my,temps,strlen(temps));
            delete [] temps;
    

Anmelden zum Antworten