Probleme mit delete und Destruktor
-
Itrah schrieb:
Ich nutze dev c++ version 4.9.9.2
Ich empfehle dringend zu wechseln. Zudem bitte nicht in Sätzen mit Return umbrechen (das macht das Forum selbstständig am Rand, und ist zudem besser lesbar).
Grundsätzlich: Wer mit Zeigern in Klassen hantiert benötigt neben dem Konstruktor auch den Kopierkonstruktor und Zuweisungsoperator (Die Bereits erwähnte Regel der Drei).
Zudem ist der Code so unleserlich formatiert, das die meisten wohl kaum den Code lesen werden.
-
Laut Wikpedia ist die neuste Version von Dev C++ von letztem Monat. Keine Ahnung, inwieweit das stimmt und ob es aktuell ist.
-
Wikipedia schrieb:
Nachdem sich in der Entwicklung von Dev-C++ seit März 2005 nichts getan hatte, erschien am 30. Juni 2011 eine neue Version (4.9.9.3) von Dev-C++, der kurz darauf Version 4.9.9.4 folgte. Diese beiden Versionen enthalten mit Version 4.5.2 ein neue Version des GCC und bringen auch alle erforderlichen Ressourcen zum Programmieren von DirectX und Win32 mit. Viele Bugs und Stabilitätsprobleme wurden ebenso behoben.
Da scheint sich was zum positiven zu wenden

-
Also wenn ich mal die zahlreichen Syntaxfehler (überflüssige Qualifikationen bei Membern, fehlerhafte Includes, fehlerhafte Klammerung) korrigiere, so dass der Code überhaupt compiliert, kann man das auch debuggen. Wie schon gesagt, verletzt du die großen drei. Weiterhin liest du fröhlich über alle Arraygrenzen hinaus und ach, es ist einfach nur Chaos. Nicht einmal mit dem Debugger finde ich da richtig durch, da alle Variablen nur kryptische einbuchstabige Namen haben.
Mein Wischiwaschi-Tipp: Befolge die großen Drei. Oder einfacher, machs wie von Pi vorgeschlagen und nimm einen vector. Dann machst du alle Zugriffe mit at(), damit du die Zugriffsfehler alle findest und korrigieren kannst. Vielleicht funktioniert es dann schon.
Mein Hardcore-Tipp: Alles nochmal neu machen. Und dieses Mal sauber!
Main Praxis-Tipp: Du bist nicht der erste, der mit Matrizen rechnet
. Da gibt es tausende Bibliotheken für und alle sind sie besser als deine.
-
Zunächst mal danke ich allen die geantwortet haben.
Egal wie ungeschickt oder wirr mein Code ist, es muss ja irgendwas mit dem delete
Befehl zu tun haben denn ohne läufts und die Ergebnisse stimmen.
Meine Frage währe nun:
Wie würde man, wen man wie ich hier in einer Klasse mit new Member erstellt die
freigabe korrekt regeln?
-
Halte dich doch an die Tipps von SeppJ. std::vector könnte dir eine Menge Arbeit abnehmen, wenn du deine Matrizen unbedingt selbst schreiben möchtest. Aber ich würde deinen Code auf jeden Fall neu machen, du kannst ihn doch selbst auch kaum lesen, hab ich Recht?

-
Ja ich will die Matritzen selber machen, sonst weis ich ja hinterher nicht
wie ich das mit der freigabe in Zukunft regele.
-
Itrah schrieb:
Wie würde man, wen man wie ich hier in einer Klasse mit new Member erstellt die
freigabe korrekt regeln?
Schon so wie du es gerade anfängst, aber eben mit allem drum und dran. Ich, asc und andere haben dir schon gesagt, was fehlt und was falsch läuft. Wenn du das nicht verstehst, google es oder frag genauer nach. Jedenfalls solltest du dich solange nicht wundern, dass dein Programm solche Fehler verursacht, wie du entweder nur den Destruktor implementiert hast oder nicht fertige Rundum-Glücklich-Klassen wie vector benutzt.
P.S.: Und bitte lass im Forum den manuellen Zeilenumbruch sein. Wir haben zuhause alle eine andere Bildschirmauflösung wie du, dafür aber hochentwickelte Programme namens Browser, die uns den Text passend umbrechen.
-
Itrah schrieb:
Egal wie ungeschickt oder wirr mein Code ist, es muss ja irgendwas mit dem delete Befehl zu tun haben denn ohne läufts und die Ergebnisse stimmen.
An delete liegt es nicht, zumindest nicht direkt. Du rufst mehrfach auf dem gleichen Speicherbereich delete auf (Dank fehlenden Kopierkonstruktor usw.).
Stell dir folgendes vor:
class A {}; int main() { A a; A b(a); // Kopierkonstruktor. A c; c = a; // Zuweisungsoperator. }Bei jeder einfachen Klasse ist obiger Code unproblematisch, da hier einfach Werte kopiert werden. Am Schluß von main wird der Destruktor von a,b und c aufgerufen.
Nun ergänzen wir das ganze mal:
class A { private: int * p; public: A() : p(new int(1)) {} ~A() { delete p; } }; int main() { A a; // Legt a.p per new an. A b(a); // Kopiert den Zeiger von a.p nach b.p A c; // Legt c.p per new an. c = a; // Überschreibt c.p mit a.p } // Destruktor von a,b,c versuchen jeweils a.p freizugeben (=>Fehler), zudem // Speicherleck bei der zweiten per new allozierten Variable, da kein new // aufgerufen wird.Hier fehlen ein eigener Kopierkonstruktor und Zuweisungsoperator...
class A { private: int * p; public: A() : p(new int(1)) { } A( A const & rhs) : p(new int(*rhs.p)) // Nicht Zeiger kopieren, sondern "Inhalt" in einem { // neu allozierten Speicherbereich kopieren. } A & operator=( A const & rhs) { // Es existiert bereits ein Speicherbereich p. // Ich werde nun die nicht ganz saubere (aber für den Anfang // verständlichere) Variante beschränken: delete p; // Alten Speicherbereich löschen p = new int(*rhs.p); // Wie beim Kopierkonstruktor nicht den Zeiger, // sondern den "Inhalt" in einen neu allozierten // Speicherbereich kopieren. return *this; } ~A() { delete p; } }; int main() { A a; // Legt a.p per new an. A b(a); // Kopiert den Inhalt, auf den der Zeiger a.p verweist in einen // neuen Speicherbereich (b.p) A c; // Legt c.p per new an. c = a; // c.p wird gelöscht, Inhalt auf dem der Zeiger a.p verweist wird // in den neuen Speicherbereich (c.p) abgelegt. } // Die Destruktoren löschen alle ihre "eigenen" Speicherbereiche.P.S: Viele Aufrufe von Konstruktoren/Kopierkonstruktoren und Zuweisungen "sieht" man erst wenn man etwas länger C++ programmiert hat, und selbst dann kann man gerne einige übersehen.
-
Klar das es nicht gehen kann, aber so hatte ichs nicht betrachtet.
Vielen Dank.