Problem mit Dekonstruktor(anscheinend)
-
Hiho, ich übe gerade ein wenig das Arbeiten mit Klassen, und versuche eine Vektorklasse zu erstellen.
Ich arbeite gerade an der Operatorenüberladung, stoße aber auf ein Problem, hier erstmal die wichtigen Teile des Codes:typedef short dim; class Vektor { public: Vektor(int a = 3); ~Vektor(); double Betrag(void); void Norm(void); void Eingabe(void); void Ausgabe(void); double GibXn(int Xn); Vektor operator *(double t); void operator =(Vektor &b); private: dim i; double *v; };Hier der Konstruktor:
Vektor::Vektor(int a) :i(a), v(NULL) { v = new double[i]; for(int c = 0;c < i;c++) v[c] = 0.0; }Hier der Dekonstruktor:
Vektor::~Vektor() { delete v; i = 0; }Und die Überladung der Operatoren:
Vektor Vektor::operator * (double t) { Vektor temp(this -> i); for(int c = 0;c < i;c++) { temp.v[c] = (this -> v[c]) * t; } printf("test"); return temp; } void Vektor::operator =(Vektor &b) { if(( b.i) != (this -> i)) { printf("Dimensionen passen nicht zueinander\n"); getchar(); exit(1); } for(int c = 0;c < i;c++) { this -> v[c] = b.v[c]; } }Ein Fehler tritt scheinbar bei der Deallokation der Zeiger von den beiden lokalen Objekten "b" und "temp" auf. Zumindest verweist mich Visual C++ 2005 immer darauf.
Aber eigentlich wird doch alles wesentliche ordentlich behandelt, der Speicher sollte ja korrekt freigegeben werden.Vielen Dank für eure Hilfe

-
Wenn du per new ein Array orderst, dann musst du das mit dem delete [] Operator zerstören.
Also:
Vektor::~Vektor() { delete[] v; i = 0; }
-
Der Copy-ctor fehlt ebenso.
-
schon mal danke für eure antworten
^^
Mir ist bewusst dass der copy konstruktor fehlt, aber den MUSS man ja nicht zwingend haben, oder ?
leider hab ich immernoch die selbe "Fehlermeldung" nachdem ich drakons Berichtigung ausgeführt hab ;/
weiter hilfe ist willkommen
-
Doch in deinem Fall brauchst du den eben Wahrscheinlich. Das klingt nämlich so, als ob du eine Speicherstelle 2 mal freigibst.
Also den Zeiger nach dem deleten sowieso auf 0 setzen und copy-ctor rein.
-
Achso, ok vielen dank, dann probiere ich das jetzt mal ^^ Wenns geklappt hat schreib ich nicht mehr, ansonsten meld ich mich nochmal

-
Ok, nach einigen Stunden probieren, komme ich immernoch nicht auf einen grünen Zweig. Das problem ist mir mittlerweile klar(prinzipiell), aber ich weiß nicht, warum es auftaucht.
Hier mein aktueller Code(in Teilen):Konstruktoren und Destruktor:
Vektor::Vektor(int a) :i(a), v(NULL) { v = new double[i]; //v = (double *) malloc(sizeof(double)*i); for(int c = 0;c < i;c++) v[c] = 0.0; } Vektor::~Vektor() { if(v != NULL) delete[] v; // Diese Zeile missfällt dem Compilerr, was wohl wir ihre //gesagt habt, an der falschen Kopierung der Objekte liegt(zeiger also auf die // selbe Adresse zeigen) v = NULL; i = 0; } Vektor::Vektor(const Vektor &Vek)//Hier muss ich irgendetwas ändern ;/ { i = Vek.i; v = new double[i]; for(int c = 0;c < i;i++) v[c] = Vek.v[c]; }typedef short dim; class Vektor { public: Vektor(int a = 3); ~Vektor(); Vektor(const Vektor &Vek); double Betrag(void); void Norm(void); void Eingabe(void); void Ausgabe(void); double GibXn(int Xn); Vektor operator *(double t); //Vektor &operator= (const Vektor &b); private: dim i; double *v; };Ist im wesentlichen identisch mit dem oberen Post.
Was muss ich nun genau am Copykonstruktor ändern ? Das ich bei dynamischer Speicherverwaltung das Kopieren selber übernehmen muss, ist mir mittlerweile klar, aber ganz offensichtlich ist meine version ja auch noch falsch.
-
Jetzt fehlt der operator=

BTW: Bitte sag nicht "diese Zeile missfällt dem Compiler", wenn das Programm beim Ablauf abstürzt.
-
Noch mal was zum Lesen für Kingcools2.
http://tutorial.schornboeck.net/bigthree.htm
-
Ok, danke Braunstein und jaaa lord hast ja recht ^^