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