Fehler?
-
GCC beschwert sich über einen Teil in meiner Klasse und ich habe irgendwie nicht ganz verstanden, was dem Compiler da nicht passt. Der grobe Aufbau:
class is_ja_auch_egal { ... public: int_table() { int a=20; this->integers = new int[a]; this->chars = new char*[a]; max=a; position=0; } ~int_table() { position=max=0; delete[] integers; integers=0; delete[] chars; chars=0; } ... int new_value(char *name, int integer) { if(position==max) { ... const short x=32, y=64; int *temp_int=new int[max]; char *temp_char[max]; // Das sollen die "Auffangbehälter" für chars und integers sein for(int i=0;i<max;i++) { temp_char[i]=new char[y]; util::cpystrn(temp_char[i], chars[i]); temp_int[i]=integers[i]; } // Umkopieraktion max+=20; delete[] integers; integers=0; delete[] chars; chars=0; integers = new int[max]; chars = new char*[max]; for(int i=0;i<(max-20);i++) { chars[i]=new char[y]; util::cpystrn(chars[i], temp_char[i]); integers[i]=temp_int[i]; } // Zurückkopieraktion delete[] temp_int; temp_int=0; delete[] temp_char; temp_char=0; // <-- Beschwerde } ... position++; return 0; } ... private: int position; int max; int *integers; char **chars; };Ich habe nicht ganz herauslesen können, warum der Compiler den ersten delete[]-Block hinnimmt und mir beim 2. was von
150 C:\Dev\src\Projects\UNCI\parser.cpp [Warning] deleting array
char\*temp\_char[((unsigned int)((int)((int\_table\*)this)->int_table::max))]' 150 C:\\Dev\\src\\Projects\\UNCI\\parser.cpp incompatible types in assignment of \int' to `char*[((unsigned int)((int)((int_table*)this)->int_table::max))]'erzählt. Schreibe ich stattdessen delete[] *temp_char; *temp_char=0; in die betreffende Zeile hält der Compiler die Klappe aber warum habe ich auch nicht so ganz vestanden...
-
Ein Fehler ist zum Beispiel das du zuviel Code postest.
-
temp_char ist ein Array und wird somit auf dem Stack angelegt und automatisch gelöscht wenn der Gültigkeitsbereich verlassen wird. Deshalb kannst du auch nicht delete darauf anwenden. Normalerweise sollte das mit dem Array so nicht funktionieren wenn max nicht konstant ist.
Mit *delete[] temp_char; würdest du aus deinem Pointerarray den ersten Pointer an delete[] übergeben und somit würde dieses Element gelöscht werden. In deinem jetzigen Code löscht du zwar die Pointer-Arrays aber die Elemente nicht und erzeugst somit ein Memory Leak.
-
Stimmt könnte leaks geben
Okay dann also besser einfach die Zweite for etwas ergänzen...... for(int i=0;i<(max-20);i++) { chars[i]=new char[y]; util::cpystrn(chars[i], temp_char[i]); integers[i]=temp_int[i]; delete[] temp_char[i]; } // das sollte es normal beheben, nicht? delete[] temp_int; temp_int=0; delete[] *temp_char; *temp_char=0; // <-- Müsste ja aber überflüssig sein ...