Keine Fehler, trotzdem Crash. Wieso?



  • Hallo folgendes Prog lässt sich einwandfrei kompilieren. Sofort nach der Ausführung meldet sich Windows mit einer Fehlermeldung zu Wort und bricht das Programm ab.

    Finde den Fehler nicht. Habt ihr vielleicht noch eine Idee?

    Vielen Dank schon mal.

    cpp-Datei:

    #include <iostream>
    #include <string>
    #include "person.h"
    #include "date.h"
    
    using namespace std;
    
    Person::Person()
    {
    	name = strdup("name");
    	address = strdup("adresse");
    	name = strdup("name");
    	//name = "name";
    	//address = "address";
    	//phone = "0";
    
    }
    
    Person::Person(char const *nm, char const *adr, char const *ph,int d, int m, int y) 
    {
    	strcpy(name,nm);
    	strcpy(address,adr);
    	strcpy(phone,ph);
    	/*name = strdup(nm);
    	address = strdup(adr);
    	phone = strdup(ph);*/
    	birthday.setday(d);
    	birthday.setmonth(m);
    	birthday.setyear(y);
    }
    
    Person::Person(char * iname, char * iaddr, char * iphone) 
    {
     int len;
    
     //Name setzen
     len = strlen(iname);
     name = new char[len+1];
     strcpy(name, iname);
    
     //Adresse setzen
     len = strlen(iaddr);
     address = new char[len+1];
     strcpy(address, iaddr);
    
     //Telefonnr. setzen
     len = strlen(iphone);
     address = new char[len+1];
     strcpy(phone, iphone);
    }	
    
    //Lösung mit Initialisierungsliste
    /*Person::Person(char const *nm, char const *adr, char const *ph,int d, int m, int y) : birthday(d, m, y)//, obj2(...), obj3...
    {  
       name = strdup(nm);
       address = strdup(adr);
       phone = strdup(ph);
    }*/
    
    Person::~Person() 
    {
      delete [] name;
      delete [] address;
      delete [] phone;
    
    }
    
    char const *Person::getname(void) const
    {
    	return name;
    }
    
    char const *Person::getaddress(void) const
    {
    	return address;
    }
    
    char const *Person::getphone(void) const
    {
    	return phone;
    }
    
    int Person::getbirthyear() //const
    {
    	return birthday.getyear();
    }
    
    int Person::getbirthmonth() //const
    {
    	return birthday.getmonth();
    }
    
    int Person::getbirthday() //const
    {
    	return birthday.getday();
    }
    
    //Date Methoden
    Date::Date()
    {
    	day = 00;
    	month = 00;
    	year = 00;
    }
    
    Date::Date(int d, int m, int y)
    {
    	day = d;
    	month = m;
    	year = y;
    }
    
    void Date::setday(int d)
    {
    	day = d;
    }
    
    void Date::setmonth(int m)
    {
    	month = m;
    }
    
    void Date::setyear(int y)
    {
    	year = y;
    }
    
    int Date::getday()
    {
    	return day;
    }
    
    int Date::getmonth()
    {
    	return month;
    }
    
    int Date::getyear()
    {
    	return year;
    }
    
    void main ( void )
    {
    	Person *test = new Person();
    
    	Person const karl("Karl", "Rheinstr. 17", "54784");
    
    	// karl.setname("Das ist nicht erlaubt.");
    
    	Person  kk("Kurt Kunz", "Frankfurt","069-5426044");
    	Person  *george = new Person("George W. Bush",
                     		"White House",
    						"001-202-456-1414");
    
    	cout << kk.getname() << ", " << kk.getaddress() << ", " << kk.getphone() << ", " << endl;
    
    	cout << george->getname() << ", " << george ->getaddress() << ", " << george ->getphone() << ", "  << endl;
    
    	delete george;
    
    	delete test;
    
    }
    

    Klasse Person:

    // Datei Person.h
    #ifndef _PERSON
    #define _PERSON
    
    #include "date.h"
    
    class Person
    {  
    	private:
    		// Datenelemente
    		char *name, *address, *phone;
    		Date birthday;	
    
    	public:
    		// Konstruktoren und Destruktor
    		Person();
    		Person(char * iname, char * iaddr, char * iphone);
    		Person::Person(char const *nm, char const *adr, char const *ph,int d, int m, int y);
    		~Person();
    
    		// Zugriffsfunktionen
    			// Funktionen zum Schreiben der Datenelemente
    		void setname(char const *n);
    		void setaddress(char const *a);
    		void setphone(char const *p);
    		void setbirthday(int yr, int mnth, int d);
    
    			// Funktionen zum Lesen der Datenelemente
    		char const *getname(void) const;
    		char const *getaddress(void) const;
     		char const *getphone(void) const;
    
    		//[inline] char const *getname() const //Inline innerhalb der Klasse
    		//{ return name; }
    
    		int getbirthyear(); //const;
    		int getbirthmonth(); //const;
    		int getbirthday(); //const;
    
    };
    
    // inline-Implementierung
    //inline char const *Person::getname() const  { return name; }
    
    #endif
    

    Klasse Date

    #ifndef _DATE
    #define _DATE
    
    class Date
    {
    	private:
    		int day;
    		int month;
    		int year;
    
    	public:
    		//Konstruktoren
    		Date();
    		Date(int d, int m, int y);
    
    		//getter und setter (Zugriffsfunktionen)
    		void setday(int d);
    		void setmonth(int m);
    		void setyear(int y);
    
    		int getday();
    		int getmonth();
    		int getyear();
    };
    
    #endif
    


  • Wenn C++, dann auch std::string, ausser du hast einen guten Grund darauf zu verzichten (einen wirklich guten).

    Ansonsten noch einige Anmerkungen:

    delete [] name;
    

    Wo ist denn das new zu diesem delete. In man strdup steht, dass der Speicher mit malloc angefordert wird und mit free freigegeben werden kann.

    Hallo folgendes Prog lässt sich einwandfrei kompilieren.

    Siehste ja selbst, dass erfolgreiche Kompilation nicht die Korrektheit des Programms garantiert. Das ist in den seltesten Faellen so.


Anmelden zum Antworten