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
    
    ...
    

Anmelden zum Antworten