Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Black-Panther

Alter Hase

  • »Black-Panther« ist der Autor dieses Themas

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

11

07.06.2007, 15:08

Ich hab versucht das ganze jetzt mit einer new-Instanz der Listen zu lösen (um eventuelles ungewolltes Kopieren zu vermeiden), hat aber auch nicht geholfen. Außerdem hab ich mir den Fehler nochmals genau angeschaut:

Zitat


Windows has triggered a breakpoint in Orb to conquer.exe

This may be due to a corruption of the heap, and indicates a bug in Orb to conquer.exe or any of the DLLs it has loaded.


Ich kann dann "Continue" sagen, und das Programm beendet ohne weitere Fehler...
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

12

07.06.2007, 15:11

da wird evtl. irgendwo über arraygrenzen geschrieben oder von einer ungültigen stelle gelesen.

Black-Panther

Alter Hase

  • »Black-Panther« ist der Autor dieses Themas

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

13

07.06.2007, 15:18

Hab ich mir auch schon gedacht... doch leider hab ich keine Ahnung, warum an jener Stelle ein ungültiger Zugriff stattfinden sollte...! Außerdem irritiert mich, dass wenn nur eine Liste Einträge enthält, da alles wie geschmiert läuft! :S
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

14

07.06.2007, 19:48

Zitat von »"Black-Panther"«

Außerdem irritiert mich, dass wenn nur eine Liste Einträge enthält, da alles wie geschmiert läuft! :S


Deshalb vermute ich ja das irgendwo eine Kopie der Liste entsteht, der Speicher geteilt wird und später doppelt freigegeben wird.
@D13_Dreinig

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

15

07.06.2007, 19:58

du kannst ja schnell mal copyctor und copy assignment operator als private deklarieren. dann meckert der compiler eh wenn er sie braucht ;)

Black-Panther

Alter Hase

  • »Black-Panther« ist der Autor dieses Themas

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

16

07.06.2007, 22:41

Hab jetzt den KopierKontruktor als privaten Member deklariert:

C-/C++-Quelltext

1
2
private:
ogUtilsList(const ogUtilsList<T>&)                              {}


und auch sonst geschaut ob irgendwo eine Kopie erstellt werden könnte... Finde einfach nichts.... *HILFE!*
Ich allokier ja auch nur eine einzige Instanz auf dem Heap, also könnte gar keine permanent zugängliche Kopie erstellt werden...
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

17

07.06.2007, 23:07

ok. ich hab deinen code jetzt mal ein weilchen angestarrt und bin zu dem schluss geommen, dass du ein problem hast:

so wie ich das sehe, löschst du in BuildingDestroyed und DivisionDestroyed ja das aktuelle element aus der liste. so, wenn dann dein iterator um eins weiterbewegt werden soll, dann ist das element von dem er ->Next nimmt nichtmehr da.

Black-Panther

Alter Hase

  • »Black-Panther« ist der Autor dieses Themas

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

18

08.06.2007, 15:37

Also ich kann das nicht nachvollziehen. In jenem Falle, dass es sich um den LETZTEN Eintrag handelt, wird in der Remove-Funktion der Liste der Iterator so modifiziert:

C-/C++-Quelltext

1
2
it->m_pNextOne = pTemp->pNext;
it->m_pCurrent = NULL;


(Wobei pTemp der zu löschende Eintrag ist!)
Demnach hat der Iterator pCurrent == NULL und pNextOne ebenfalls gleich NULL!

Bei der Inkrementierung wird folgendes gemacht

C-/C++-Quelltext

1
2
ogUtilsIterator<T>& operator ++ ()                              
        {if(m_pCurrent) m_pCurrent = m_pCurrent->pNext; else {m_pCurrent = m_pNextOne; m_pNextOne = NULL;} return *this;}

Das bedeutet, dass sich praktisch die Werte nicht ändern. Beides NULL-Pointer. Dann beginnt der nächste Schleifendurchgang und der Iterator->m_pCurrent wird auf NULL überprüft. Ist NULL, also wird die Schleife verlassen, bevor überhaupt versucht wird auf das NULL-Objekt zuzugreifen.
Außerdem würde, wenn dieser Fehler wirklich da wäre, das Programm auch abstürzen, wenn nur eine LIste Einträge enthält. Oder habe ich dich falsch verstanden?
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

Black-Panther

Alter Hase

  • »Black-Panther« ist der Autor dieses Themas

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

19

08.06.2007, 15:51

Habe eine neue Entdeckung gemacht. Es ist gar nicht IMMER das LETZTE Element der 2. Liste. Nein, es kann auch das 2., 3. oder x. Element sein. Aber es passiert immer in der 2. Liste... NIE in der Ersten!
Ich versteh jetzt gar nichts mehr... I hoffe immer noch inständig, dass es einer von euch versteht :S
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

20

09.06.2007, 15:23

Ich kann den Fehler nicht reproduzieren.
@D13_Dreinig

Werbeanzeige