Debug Assertion bei Verwendung von delete!
-
Hallo Leute,
ich habe ein kleines Programm geschrieben um den Real- und Imaginärteil von komplexen Zahlen zu addieren.
Wenn ich kompiliere bekomme ich 0 Fehler und 0 Warnungen aber beim Ausführen bekomme ich eine "Debug Assertion Faailed".Hier mal mein kleiner Code!
Hauptprogramm:
#include "MyComplex.h" int main() { complex x(1.0,2.0); complex y(2.0,4.0); complex z(0.0,0.0); x.print(); y.print(); z.add(x,y); z.print(); return 0; }hier die Klasse:
#include <iostream> using namespace std; class complex { private: float *re, *im; public: complex(float r, float i); ~complex(); float real (); float imag (); void add (complex a, complex b); void print (); }; complex::complex(float r, float i) { re =new float; *re = r; im = new float; *im = i; } complex::~complex() { delete re; re = 0; delete im; im = 0; } float complex::real() { return *re; } float complex::imag() { return *im; } void complex::add(complex a, complex b) { *re = a.real() + b.real(); *im = a.imag() + b.imag(); } void complex::print() { cout << "Realteil: " << *re << " Imaginaerteil: " << *im << endl << endl; }und hier die Fehlermeldung:
http://www8.picfront.org/picture/s4lFbXE5/thb/DBGASS.PNG
Vielen Dank für eure Hilfe und Mühe
!Regards Duckler
-
Falls Ihr irgendwie mehr Infos braucht dann sagt es mir...!
Vielen Dank,
Duckler
-
hiho,
also ich hab deinen Code in 2010er VS getestet und bei mir kommt diese Meldung nicht.Wollte aber paar Anmerkungen zu deinem Code machen:
- Definitionen kommen nicht in die Headerdatei, außer es handelt sich um inline oder templates. In der Headerdatei solltest du nur die Methoden deklarieren und sie in einer .cpp Datei definieren.
- using - Direktiven sollte man in Headerdateien vermeiden, könnte unterwünschte Namenskonflikte verursachen.
- Wieso benutzt du Zeiger und new ?
-
Hi ich mach das nur auf diese Art und Weise weil es eine Aufgabe ist (Studium) und es so gewünscht wir.
In VS 2008 bekomm ich den Fehler auch.
Wenn ich den add Aufruf auskommentiere kommt die Feklermeldung nicht.
Kann es sein dass ich die Objekte erstelle dann zerstöre aber in add() auf die beiden erstellten *und* zerstörten Objekte a und b zugreifen will und das ganze deshalb verrutscht?Danke fur Deine schnelle Antwort Dweb!
Viele Grüße Duckler!
-
Hi ich mach das nur auf diese Art und Weise weil es eine Aufgabe ist (Studium) und es so gewünscht wir.Dann ist eurer Dozent gelinde gesagt einfach nur schlecht, oder du hast etwas missverstanden. Grundsätzlich braucht deine Klasse so wie du sie mit Zeigern und new verwendest aber noch mindestens den Zuweisungsoperator und Kopierkonstruktor (oder diese explizit müssen verboten werden, in dem sie privat deklariert, aber nicht implementiert werden)!
-
duckler schrieb:
Kann es sein dass ich die Objekte erstelle dann zerstöre aber in add() auf die beiden erstellten *und* zerstörten Objekte a und b zugreifen will und das ganze deshalb verrutscht?
Nein, die 3Objekte (x,y und z) werden erst beim verlassen des Güligkeitsbereichs zerstört (Destruktor wird aufgerufen), und das ist ...
#include "MyComplex.h" int main() { complex x(1.0,2.0); complex y(2.0,4.0); complex z(0.0,0.0); x.print(); y.print(); z.add(x,y); z.print(); return 0; } // ... erst hier der Fall.ahh moment mal.^^
z.add(x,y);Du erzeugst hier nur eine flache-Kopie, d.h. es werden nur die Zeiger kopiert, nicht aber die Objekte auf die die Zeiger zeigen.
Das heißt wenn die add-Funktion abgearbeitet ist, wird der Destruktor für 'a' und 'b' aufgerufen. --> Die Objekte, auf die die Zeiger zeigen, werden dann zerstört, weil diese, wie gesagt, nicht kopiert werden.z.print();Hier willst du wieder auf die Objekte zugreifen, sie wurden aber schon zerstört.
-
Implementier mal noch den Copy-Constructor
complex::complex(const complex& ori) { this->re = new float( ori.real() ); this->im = new float( ori.imag() ); }und mache die real() und imag() Methoden konstant:
float real () const; // Deklaration float complex::real() const // Definition { return *re; }( und das gleiche noch bei imag() )
-
Hi Dweb,
vielen, vielen, vielen, vielen, vielen, vielen, vielen, DANK Dweb es funktioniert tadellos

Viele Grüße,
Duckler
-
Kann ich Dir irgendwie eine PN schicken Dweb?
Viele Grüße,
Duckler
-
immer gern zu Diensten

Was mich nur wundert, dass die Meldung bei VS 2010 nicht kommt, hmm^^
grüßli
-
*seufz*
- Die Dreierregel wurde verletzt.
- re und im brauchen aber keine Zeiger sein. Das ist -- mit Verlaub -- völliger Schwachsinn.
-
Danke krümelkacker von der Dreierregel hatte ich bisher noch nichts gehört!
Viele Grüße,
Markus
-
P.S.: Dweb geht das irgendwie mit der PN ?
Viele Grüße,
Duckler
-
duckler schrieb:
P.S.: Dweb geht das irgendwie mit der PN ?
Viele Grüße,
Ducklerhmm "PN" ?^^
-
Personal Note, E-Mail u.s.w.?
Viele Grüße,
Duckler
-
Dweb schrieb:
duckler schrieb:
P.S.: Dweb geht das irgendwie mit der PN ?
Viele Grüße,
Ducklerhmm "PN" ?^^
PN gibts nicht, aber Email an die registrierte Email Adresse.
-
Wenn du bei mir auf "Benutzerprofil" klickst, müsste da dann "email senden" stehn.

Ansonsten kannst du mir auch icqNR oder so geben oder mit schicken.
-
Hi dweb,
da mußt Du nochmal nachgucken, da steht leider nicht ;-)!
Viele Grüße,
Duckler
-
duckler schrieb:
Hi dweb,
da mußt Du nochmal nachgucken, da steht leider nicht ;-)!
Viele Grüße,
Ducklernu event. ?
-
Hi Dweb,
hab mir Pidgin gezogen dann können wir mal chatten, meld mich morgen nochmal!
Viele Grüße,
Duckler