Beschädigung des Heaps - Fehlermeldung nach Schließung des Programms



  • Hallo,

    bekomme immer die Meldung dass Windows einen Haltepunkt in Passwort.exe ausgelöst hat. Dies kann auf eine Beschädigung des Heaps zurückzuführen sein.

    Komischerweise läuft das Programm ja einwandfrei, funktioniert alles..etc; nur wenn ich dann über die Konsole auf schließen geh, sagt mir mein Visual Studio 2010 dass da die Beschädigung im Heap ist..

    Kann aber ja bloß an den Zeigern liegen, alles andere wird ja auf dem Stack instanziert.. ?!

    Hier mal der Quellcode:

    #define _CRT_SECURE_NO_WARNINGS
    #include <iostream>
    #include <string>
    using namespace std;
    
    char passwort[10];
    char passwortabfrage[10];
    char passwortüberprüfung[10];
    char name[20];
    char nameabfrage[20];
    
    int auswahl_eingeben();
    int Konto_neu();
    
    	int auswahl_eingeben()
    	{
    		int auswahl;
    		cout<<"1 Konto er\x94 \bffnen"<<endl;
    		cout<<"2 Geld einzahlen"<<endl;
    		cout<<"3 Geld abheben"<<endl;
    		cout<<"4 Exit"<<endl; 
    		do
    		{
    			cout<<"Ihre Auswahl: ";
    			cin>>auswahl;
    			cin.ignore();
    		}while(auswahl<1||auswahl>4);
    		return auswahl;
    	}
    
    	void Geld_einzahlen()
    	{
    		cout<<"Geld einzahlen"<<endl;
    	}
    
    	void Geld_abheben()
    	{
    		cout<<"Geld abheben"<<endl;
    	}
    
    	struct eintrag
    	{
    		char *Vorname;
    		char *Nachname;
    		char *Telefon;
    		char *Geburtsjahr;
    		char *PLZ;
    		char *Passwort;
    		char *Passwortüberprüfung;
    	};
    
    int main()
    {
    	char antwort;
    	do
    {
    
    	int auswahl;
    
    	cout<<endl<<endl;
    	cout<<"-----------------------------"<<endl;
    	cout<<"-------Sparkassenkonto-------"<<endl;
    	cout<<"-----------------------------"<<endl<<endl;
    
    	do
    	{
    		auswahl=auswahl_eingeben();
    		switch(auswahl)
    		{
    		case 1: Konto_neu(); break;
    		case 2: Geld_einzahlen(); break;
    		case 3: Geld_abheben(); break;
    		}
    	}while (auswahl!=4);
    	return 0;
    
    	cout<<"Wollen Sie es nocheinmal probieren ?   y/n";
    
    	cin>>antwort;
    	cin.ignore(); 
    
    	system("cls");
    
    }while(antwort == 'y');
    
    	return 0;
    }
    
    int anzahl, i; 
    eintrag *liste=new eintrag[anzahl];
    
    int Konto_neu()
    {
    char zeile[21];
    
    cout<<"Wieviele Eintr\x84ge moechten Sie machen ? ";
    cin>>anzahl;
    cin.ignore();
    system("cls");
    
    //Eingabe
    for(i=0;i<anzahl;i++)
    {
    	cout<<endl<<endl;
    	cout<<"-----------------------------"<<endl;
    	cout<<"-------Sparkassenkonto-------"<<endl;
    	cout<<"-----------------------------"<<endl<<endl;
    
    	cout<<"Bitte geben Sie Ihren Vornamen ein: ";
    	cin.get(zeile,20);
    	cin.ignore(255, '\n');
    	liste[i].Vorname=new char[strlen(zeile)+1];
    	strcpy(liste[i].Vorname,zeile);
    
    	cout<<"Bitte geben Sie Ihren Nachname ein: ";
    	cin.get(zeile,20);
    	cin.ignore(255, '\n');
    	liste[i].Nachname=new char[strlen(zeile)+1];
    	strcpy(liste[i].Nachname,zeile);
    
    	cout<<"Bitte geben Sie Ihre Telefonnummer ein: ";
    	cin.get(zeile,20);
    	cin.ignore(255, '\n');
    	liste[i].Telefon=new char[strlen(zeile)+1];
    	strcpy(liste[i].Telefon,zeile);
    
    	cout<<"Bitte geben Sie Ihr Geburtsdatum ein: ";
    	cin.get(zeile,20);
    	cin.ignore(255, '\n');
    	liste[i].Geburtsjahr=new char[strlen(zeile)+1];
    	strcpy(liste[i].Geburtsjahr,zeile);
    
    	cout<<"Bitte geben Sie Ihre Postleitzahl ein: ";
    	cin.get(zeile,20);
    	cin.ignore(255, '\n');
    	liste[i].PLZ=new char[strlen(zeile)+1];
    	strcpy(liste[i].PLZ,zeile);
    
    	cout<<"Bitte geben Sie ein gew\x81nschtes Passwort ein: ";
    	cin.get(zeile,20);
    	cin.ignore(255, '\n');
    	liste[i].Passwort=new char[strlen(zeile)+1];
    	strcpy(liste[i].Passwort,zeile);
    
    	cout<<"Bitte geben Sie das Passwort nochmal ein: ";
    	cin.get(zeile, 10);
    	cin.ignore(255, '\n');
    	liste[i].Passwortüberprüfung=new char[strlen(zeile)+1];
    	strcpy(liste[i].Passwortüberprüfung,zeile);
    
    	cout<<endl;
    
    	if (strcmp(passwort, passwortabfrage)==0)
    	{
    		cout<<"Das gew\x81nschte Passwort wurde akzeptiert"<<endl;
    	}
    	else
    	{
    		cout<<"Passw\x94rtervergleich falsch - Bitte erneut eingeben"<<endl<<endl;
    		return main();
    	}
    }
    
    return Konto_neu();
    }
    

    gruß



  • Ein erster Vorschlag: Schmeiß' die char-Zeiger über Bord und verwende std::string stattdessen (und std::vector anstelle des dynamischen Arrays). Außerdem bringt es nicht viel, wenn du erst den Speicher anforderst und danach abfragst, wieiviel Speicher du benötigst.



  • Das kann doch gar nicht vernünftig laufen ... die Funktion Konto_neu hat überhaupt keinen ordentlichen Ausgang, oder übersehe ich den gerade? Aber bei so einer (Entschuldigung) gequirlten Schei... weiß man gar nicht, wo man anfangen soll, Tips zu geben.
    Außerdem scheinst Du beratungsresistent zu sein: Du hast in anderen Threads schöne Lösungen aufgezeigt bekommen, wie man Umlaute auf die Konsole bekommt, und wie man den Konsolenbildschirm löscht, und benutzt hier für die Umlaute eine Methode, die den Quellcode hässlich und schlecht lesbar macht, und für das Bildschirm löschen die grauenhafte 'system' - Funktion, die zum Bildschirm löschen ein externes Programm startet, ts ts ts ...
    Was glaubst Du, wie groß hier

    int anzahl, i;
    eintrag *liste=new eintrag[anzahl];
    

    Dein Listarray wird?
    Also auf den ersten Blick sehe ich als ganz offensichtliche mögliche Fehlerquellen die unvorhersehbare Größe der Liste, das Fehlen eines vernünftigen Endes der Funktion Konto_neu und die auch schon von CStoll erwähnten char-Arrays ...
    Statt baffzig mal

    cin.get(zeile,20);
        cin.ignore(255, '\n');
        liste[i].Telefon=new char[strlen(zeile)+1];
        strcpy(liste[i].Telefon,zeile);
    

    überleg mal, ob man das nicht einmal in eine Funktion auslagern kann.



  • "Das kann doch gar nicht vernünftig laufen ... die Funktion Konto_neu hat überhaupt keinen ordentlichen Ausgang, oder übersehe ich den gerade? Aber bei so einer (Entschuldigung) gequirlten Schei... weiß man gar nicht, wo man anfangen soll, Tips zu geben.
    Außerdem scheinst Du beratungsresistent zu sein: Du hast in anderen Threads schöne Lösungen aufgezeigt bekommen, wie man Umlaute auf die Konsole bekommt, und wie man den Konsolenbildschirm löscht, und benutzt hier für die Umlaute eine Methode, die den Quellcode hässlich und schlecht lesbar macht, und für das Bildschirm löschen die grauenhafte 'system' - Funktion, die zum Bildschirm löschen ein externes Programm startet, ts ts ts ...
    "

    1. Ich habe erst vor ca. 3 Monaten das programmieren angefangen und zwar in 'ner volkshochschule, von daher habe ich noch keine so große Erfahrung mit den Codes und Funktionen..etc;

    2. Ich fand, das mit den "x\84" schaut gut aus, und man kanns sich denken, ob da jetzt ein Ü, ä, ö reinkommt 🙂

    3. warum sollte das schlecht sein, die System-Funktion aufzurufen ?? (nimmt die dann etwa zuviel Zeit in Anspruch??!?!)

    Wollt ich bloß mal gesagt haben.

    Das mit den vorgeschlagenen Lösungen mach ich dann morgen, heute keinen Bock mehr auf Programmierung.

    gruß


Anmelden zum Antworten