Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
magynhard Super JLI'ler
Anmeldedatum: 26.04.2003 Beiträge: 461 Wohnort: Wild durch die Welt ;-) Medaillen: Keine
|
Verfasst am: 05.09.2005, 19:05 Titel: Dynamische 2D-Felder im Speicher reservieren & freigeben |
|
|
Ich habe mir wie folgend ein 2D-Feld angelegt:
CPP: | spielfeld = new stueck*[spielfeldhoehe];
for(int i = 0; i < spielfeldhoehe; i++)
{
spielfeld[i] = new stueck[spielfeldbreite];
}
|
spielfeld ist vom typ stueck **.
Im Destruktor der selben Klasse findet sich folgendes:
CPP: | for (int i=0; i< spielfeldhoehe; i++)
{
delete [] spielfeld[i];
}
delete [] spielfeld;
|
Ist doch eigentlich korrekt so?
Scheinbar nicht, denn beim Aufruf des Destruktors (Die Funktion in der spielfeld angelegt wird, wird verlassen) gibt's nen unschönen Absturz.
Zitat: |
Die Anweisung "0x778cca14" verweist auf Speicher in "0x00000000" ...
|
In meinem Falle beträgt die Größe 128x128
Tritt jedoch nicht immer auf, sondern "zufallsbedingt".
Wenn ich es von meiner IDE ausführe, ist es hinten immer 0x000000000 und klappt nie.
Wenn ich es mit dem Explorer ausführe geht's ein paar mal (unterschiedlich ~3-10mal) hin und her, d.h. anlegen und wieder löschen und dann kommt manchmal ebenfalls 0x00000000 oder eine mit Großteil an Nullen wie 0x000000072a oder 0x4000000000.
(HEX-Werte sind in Sachen Stellen nur provisorisch hingeschrieben, daher evtl. abweichende Längen)
Der Fehler tritt immer innerhalb der Schleife auf.
Wer weiß Rat? _________________ Niemand ist hoffnungsloser versklavt als der, der fälschlich glaubt frei zu sein. [J. W. Goethe]
|
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 05.09.2005, 19:21 Titel: |
|
|
hm, ich habs mir einfacher gemacht, einfach n 1DArray und berechne die Koordinaten:
CPP: | inline int * P(unsigned int x, unsigned int y)//gibt ein zeiger auf einen beliebiges element zurück
{
return &(m_Levelarray[m_LevelsizeX*y+x]);
}
|
funzt sehr einfach beim erstellen und löschen, beim aufrufen auch sehr easy, was will man mehr? _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
Dr. Best Senior JLI'ler
Alter: 34 Anmeldedatum: 17.06.2004 Beiträge: 269 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 05.09.2005, 19:39 Titel: |
|
|
Ich sehe da an sich auch keinen Fehler.
Aber ich würde dir grundsätzlich raten zum releasen immer folgende defines zu verwenden:
Code: | #define SAFE_DELETE(p) {if(p){delete (p); (p)=NULL;}}
#define SAFE_ARRAY_DELETE(p) {if(p){delete [] (p); (p)=NULL;}}
#define SAFE_RELEASE(p) {if(p){(p)->Release(); (p)=NULL;}} |
Die stammen glaube ich aus irgendeinem DirectX utility header.
Sicher ist sicher und es kann einem viel Arbeit bei der Fehlersuche ersparen und macht das Programm zuverlässiger. _________________
Ich bin da, wer noch? |
|
Nach oben |
|
|
abc_d JLI Master Trainee
Alter: 34 Anmeldedatum: 27.01.2003 Beiträge: 615
Medaillen: Keine
|
|
Nach oben |
|
|
Christian Rousselle Site Admin
Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 05.09.2005, 19:41 Titel: |
|
|
Bist du sicher, dass der Destruktor der Elemente (stueck) korrekt ist? |
|
Nach oben |
|
|
magynhard Super JLI'ler
Anmeldedatum: 26.04.2003 Beiträge: 461 Wohnort: Wild durch die Welt ;-) Medaillen: Keine
|
Verfasst am: 05.09.2005, 22:36 Titel: |
|
|
Christian Rousselle hat Folgendes geschrieben: | Bist du sicher, dass der Destruktor der Elemente (stueck) korrekt ist? |
Bingo!
Da lag das Problem.
Ich danke erleichtert.
Die anderen Vorschläge werde ich dennoch evtl. ausprobieren/genauer ansehen. _________________ Niemand ist hoffnungsloser versklavt als der, der fälschlich glaubt frei zu sein. [J. W. Goethe]
|
|
Nach oben |
|
|
|