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

1

19.08.2012, 23:51

Übungsaufgaben 1.4.7 Aufgabe 2: Problem mit TB_SAFE_MEMFREE()

Hallo,
ich habe folgenden (von der Aufgabe abweichenden, aber auf das wesentliche des Problems reduzierten) Code:

http://nopaste.info/dabf9bec35.html (Der Code-Einbinder im Forum macht mir die Formatierung kaputt)


Sobald ich debuggen will kommt die Fehlermeldung:
Eine Ausnahme (erste Chance) bei 0x6e1bc584 (TriBaseD.dll) in Test_Projekt(Debug).exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x0000000a.
Unbehandelte Ausnahme bei 0x6e1bc584 (TriBaseD.dll) in Test_Projekt(Debug).exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x0000000a

Wenn ich nun "TB_SAFE_MEMFREE" weglasse, funktioniert es.
Was könnte ich machen?

Gruß
Julien

2

20.08.2012, 00:15

Du veränderst deinen Pointer mit pTest++;. Er zeigt also nicht mehr auf den Start des allokierten Bereichs und damit gibt es diese Probleme.
"Theory is when you know something, but it doesn’t work. Practice is when something works, but you don’t know why. Programmers combine theory and practice: Nothing works and they don’t know why." - Anon

Nimelrian

Alter Hase

Beiträge: 1 216

Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy

  • Private Nachricht senden

3

20.08.2012, 00:36

Und damit du gleich die Lösung hast (Auch wenn du sie besser nicht brauchst, wenn du dich durch das Buch arbeiten willst ;)): *pTest++; statt pTest++;
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

4

20.08.2012, 11:52

@ Steef:
Vielen Dank dir, das hat das Problem gelöst :)

@Nimelrian:
Den dereferenzierten Zeiger zu inkrementieren hätte zwar die Fehlermeldung verhindert, da der Zeiger so auf pTest[0] bliebe und TB_SAFE_MEMFREE korrekt freigeben könnte, ist aber überhaupt nicht die Lösung. Ich will ja schließlich nicht die Werte im Bereich verändern, sondern die Zeigervariable eins weiter wandern lassen. Das ist ganz normale Zeigerarithmetik. "pTest++;" ist schon so gewollt.

birdfreeyahoo

Alter Hase

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

5

21.08.2012, 00:29

Du kannst das nicht einfach so machen, da du nicht weißt welcher Speicher dahinterliegt.

6

21.08.2012, 14:38

Du musst Speicher immer in genau den Blöcken freigeben, in denen du ihn angefordert hast. Im Moment versuchst du aus dem Array den 2ten Eintrag freizugeben, was nicht geht.
Du musst einfach die Startadresse angeben, dann wird das komplette Array freigegeben. Du musst das Array also so lange behalten, bis du keinen der Einträge mehr brauchst.
Als alternative gibt es diverse STL-Container, wie std::vector oder std::list.
Lieber dumm fragen, als dumm bleiben!

Werbeanzeige