Konstruktor und Destruktor für 2d char Arrays



  • Hi,
    ich versuche gerade aus einem alten C TicTacToe Prog ein C++ Prog zu basteln.
    Das funktioniert bis jetzt auch recht gut. Das einzige was nicht funktionieren will ist das deleten des 2d Arrays.
    So schauen meine Kon-/Destruktor aus:

    Board::Board(){
          for(int i = 0 ; i < 3 ; i++){
              for (int j = 0; j < 3; j++){
    			GameBoard[i][j] = _strdup(" ");
    		  }    
          }
    	  Player1 = _strdup("X");
          Player2 = _strdup("O");
    }      
    Board::~Board(){
          delete [] &GameBoard;
          delete Player1;
          delete Player2;
    }
    

    GameBoard ist in der Class Board als char * Gameboard[3][3] definiert.

    Nach dem ich ein wenig rumgegooglet hatte hab ich ein Bsp für int Arrays
    gefunden, und dieses für char umgeschrieben.

    Test_C::Test_C(){
           x = 3;
           y = 3;
           Matrix = new char *[x];
           for(inti=0; i<x; i++){
               Matrix[i] = new char *[y];
           }
    }
    Test_C::~Test_C(){
           int i;
           for (i = 0; i < x; i++){
               delete [] Matrix[i];
           }
           delete [] Matrix;
    }
    

    wobei Matrix als char **Matrix; definiert ist. Das Funktioniert leider auch nicht. Ich bekommen nur noch mehr Fehlermeldungen(konvertierung von char[*][3] nach char [3][3] nicht erlaubt, oder so)
    Kennt jemand eine funktionierende variante wie man sowas richtig initalisiert.

    Schon mal Danke
    Dennis



  • _strdup() ist keine Standardfunktion und vermutlich auf C-Bedürfnisse zugeschnitten - sprich: die angeforderten C-Strings mußt du vermutlich mit free() freigeben. Aber ich würde dir empfehlen, statt der char-Zeiger lieber std::string zu verwenden (wobei - hier reicht es wohl auch, einzelne char's zu speichern).



  • ok
    wenn ich free() benutze und das prog ausführe, bekomme am ende einen fehler in der
    dbgheap.c . Ich vermute mal, das kommt dadurch das der speicher nicht richtig freigegeben wird.

    Werde es mal mit den std::strins versuchen.
    Die ich doch mit String.erase(0,String.lenght()); freigeben, oder reicht da auch delete?



  • DD2K schrieb:

    Die ich doch mit String.erase(0,String.lenght()); freigeben, oder reicht da auch delete?

    std::string foo("bar");
    

    feddich, mehr brauchste nich. lies mal ein c++-tutorial.



  • DD2K schrieb:

    Die ich doch mit String.erase(0,String.lenght()); freigeben, oder reicht da auch delete?

    die brauchst du gar nicht freigeben - das macht deren eigener Destruktor, wenn dein Objekt vernichtet wird.



  • Alles klar,
    dank euch

    MFG
    Dennis

    Ich sollte wirklich wieder mal in meine Bücher schauen 🙂



  • Auch wenn das Problem hier schon gelöst zu sein scheint, will ich trotzdem noch meinen Senf dazu geben (mein Espresso ist mir noch zu heiß):

    Es ist bei TicTacToe doch m.E. überhaupt nicht sinnvoll, dynamischen Speicher zu verwenden (ob nun via new, oder als std::string). Das Spielfeld hat eine (zur compile-Zeit) bekannte Größe: 3 x 3 = 9 Felder. Und auf dem Stack sind diese neun Bytes auch nicht wirklich schmerzhaft.

    Demnach reicht es, der Board-Klasse ein entsprechendes Attribut mitzugeben.
    (als eindimensionales Beispiel)

    class TTTBoard
    {
        char fields[9];
        // ...
    };
    

    Adressierbar durch y * 3 + x (wobei 0 >= (x, y) <= 2).

    Dadurch, dass hier kein dynamischer Speicher angefordert wird, entfällt auch das Freigeben - welches dann ebenfalls automatisch erfolgt, sobald das Board-Objekt "out of scope" fällt.

    Grüße...

    Heiko



  • oder gleich:

    char fields[3][3];
    

    ohne eigene Indexberechnung...


Anmelden zum Antworten