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.