Destruktor macht Probleme mit delete[]
-
Ich habe ein Problem mit dem Destruktor meiner Class.
class Tbrute{ public: char* digits; char* code; //--------------------------------------------------------------- Tbrute(int i) //hier wird digits initialisiert :len(i) { digits = new char[26]; code = new char[len]; } //--------------------------------------------------------------- ~Tbrute() // <-- Der macht das Problem { delete[] digits; // digits = NULL; delete[] code; // code = NULL; } };Ich bekomme immer folgenden Laufzeit Fehler:
*** glibc detected *** double free or corruption (!prev): 0x08048f20 *** AbortedWoran liegt das?
MFG
Ace
-
Du hast Objekte deiner Klasse kopiert und dabei haben alle Kopien Zeiger auf den selben Speicherbereich. Und wenn du die löscht erzeugt das zweite Objekt ein double free.
Schreibe einen Kopierkonstruktor und einen assignment operator.
Tbrute::Tbrute(Tbrute const & other);
Tbrute & operator=(Tbrute const & other);Besser ist es, wenn du std::vector für digits und code benutzt. Dann brauchst du die beiden Methoden nicht.
-
Std::vector ist ein Templamte
hab ich gelesen.Aber was ist der Unterschied zu den normalen Variablen also keine mit new?
Und kann ich denen dann mit einer Funktion.
z.b. init_brute() direkt einige Werte zuweisen?MFG
aceEdit:
Eigentlich habe ich nur eine kopie erzeugt.
Diese wird dann zerstört und wieder eine neue erzeugt.
Allerdings ist dann code irgendwie noch gefüllt.
Der Speicher den ich mit new reserviert habe wird nicht gelöscht.
-
AceKiller73 schrieb:
Std::vector ist ein Templamte
hab ich gelesen.Aber was ist der Unterschied zu den normalen Variablen also keine mit new?
Und kann ich denen dann mit einer Funktion.
z.b. init_brute() direkt einige Werte zuweisen?MFG
aceEdit:
Eigentlich habe ich nur eine kopie erzeugt.
Diese wird dann zerstört und wieder eine neue erzeugt.
Allerdings ist dann code irgendwie noch gefüllt.
Der Speicher den ich mit new reserviert habe wird nicht gelöscht.Die normalen Variablen werden einfach kopiert, wie deine Zeiger auch. Nur wird bei Zeigern nicht das kopiert, auf das sie zeigen.
Mit std::vector ist es ganz einfach.
Du machst std::vector<char> digits und std::vector<char> code:
#include <vector> class Tbrute{ public: std::vector<char> digits; std::vector<char> code; //--------------------------------------------------------------- Tbrute(int i) //hier wird digits initialisiert :len(i), digits(26), code(len) { } //--------------------------------------------------------------- ~Tbrute() // <-- Der macht das Problem { } };Die sonstige Benutzung ist identisch.
-
Dieser Thread wurde von Moderator/in rüdiger aus dem Forum Linux/Unix in das Forum C++ verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Also da ich mit den Prblem nicht weiter komme nochmal mein Ziel.
Ich möchte eine Klasse erstellen mit den Member Vars:
code
digitsDiese sollen dann über eine init_brute funktion gefüllt werden können ( könnte ich auch gleich in den Konstruktor einbauen).
Jetzt hab ich die Variante mit nem Pointer und new genommen, weil ich bei nem normalen char array keine Änderungen vornehmen kann

Da kommt dann dass ISO c++ die zuweisung von Felder oder so verbietet.
Bevor jetzt jemand mit string kommt und so möchte ich sagen, dass ich nur char brauch und es für mich güstiger ist den datentyp zu verwenden.
Als was würdet ihr die Vars deklarieren, damit ich sie in funktion der Klasse bearbeiten kann und wenn die klasse zerstört wird, werden die vars auch komplett zerstört.
MFG
Ace
-
AceKiller73 schrieb:
Also da ich mit den Prblem nicht weiter komme nochmal mein Ziel.
...
Jetzt hab ich die Variante mit nem Pointer und new genommen, weil ich bei nem normalen char array keine Änderungen vornehmen kann

Hast du
Tbrute::Tbrute(Tbrute const & other); Tbrute & operator=(Tbrute const & other);implementiert (oder private deklariert)?
AceKiller73 schrieb:
Als was würdet ihr die Vars deklarieren, damit ich sie in funktion der Klasse bearbeiten kann und wenn die klasse zerstört wird, werden die vars auch komplett zerstört.
Siehe Pontos Code.
-
Wenn ich meine Klasse in einer Schleife aufrufe und konstruiere:
for(int i = 1; i<=4;i++) { Tbrute brute(i); brute.init_brute(..) ... }Das Objekt wird zum ersten mal erzeugt. Code ist "";
2. Schleifendurchlauf
Das Objekt wird zum zweiten mal erzeugt. Code ist der des alten Tbrutes.Woran liegt das?
Wird das Objekt nicht am Ende eines Durchlaufs zerstört?
Wieso wird bei neuen Objekt, wenn der Pointer eigentlich einen neuen new Bereich bekommen sollte der andere genommen?Sry das ich soviel frage

Und dann nochmal der Kopier Konstruktor. Wieso braucht man den bzw. ich
weil eigentlich will ich ja jedes mal eines NEUES Objekt erstellen und net verstehen.Naja hoffe ich gehe euch nicht zu sehr auf die Nerven
MFG
Ace
-
AceKiller73 schrieb:
Das Objekt wird zum ersten mal erzeugt. Code ist "";
2. Schleifendurchlauf
Das Objekt wird zum zweiten mal erzeugt. Code ist der des alten Tbrutes.Woran liegt das?
Wird das Objekt nicht am Ende eines Durchlaufs zerstört?
Wieso wird bei neuen Objekt, wenn der Pointer eigentlich einen neuen new Bereich bekommen sollte der andere genommen?Nein,
Codeist im ersten Durchlauf nicht "", sondern irgendeine zufällige Bytefolge. Du forderst lediglich Speicher fürCodean, nichts weiter.Der zweite Punkt ist ein wenig konfus... du schreibst doch selbst schon dass das Objekt zerstört (dementsprechend der Speicher freigegeben) wird.
AceKiller73 schrieb:
Und dann nochmal der Kopier Konstruktor. Wieso braucht man den bzw. ich
weil eigentlich will ich ja jedes mal eines NEUES Objekt erstellen und net verstehen.Deswegen schrieb ich "(oder private deklariert)". Allerdings deutet die Fehlermeldung im OP darauf hin dass du irgendwo Kopien erstellst, deswegen hat Ponto angemerkt dass du den copy-ctor &
op=korrekt implementieren musst.