JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=a6221dabc4ccfcf7ab3629f7387921c0Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Dynamische 2D-Felder im Speicher reservieren & freigeben

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
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

BeitragVerfasst am: 05.09.2005, 19:05    Titel: Dynamische 2D-Felder im Speicher reservieren & freigeben Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 05.09.2005, 19:21    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Dr. Best
Senior JLI'ler


Alter: 34
Anmeldedatum: 17.06.2004
Beiträge: 269
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 05.09.2005, 19:39    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen AIM-Name MSN Messenger
abc_d
JLI Master Trainee


Alter: 34
Anmeldedatum: 27.01.2003
Beiträge: 615

Medaillen: Keine

BeitragVerfasst am: 05.09.2005, 19:39    Titel: Antworten mit Zitat

Mit der Suchen funktion findet man ein paar Themen zu "dynamischesmehrdimensionales Array".

Ansonsten was von Patrick: http://www.online-tutorials.net/faq/c++-wie-erstellt-man-ein-dynamisches-mehrdimensionales-array/tutorials-t-47-92.html
_________________
http://mitglied.lycos.de/sarti/linuxisevil.gif Linux is evil - get the fact.

Never touch a running System - der Systemling
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Christian Rousselle
Site Admin


Alter: 48
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 05.09.2005, 19:41    Titel: Antworten mit Zitat

Bist du sicher, dass der Destruktor der Elemente (stueck) korrekt ist?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
magynhard
Super JLI'ler



Anmeldedatum: 26.04.2003
Beiträge: 461
Wohnort: Wild durch die Welt ;-)
Medaillen: Keine

BeitragVerfasst am: 05.09.2005, 22:36    Titel: Antworten mit Zitat

Christian Rousselle hat Folgendes geschrieben:
Bist du sicher, dass der Destruktor der Elemente (stueck) korrekt ist?


Bingo!
Da lag das Problem.

Ich danke erleichtert. Smile



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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum