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

12.12.2016, 15:45

Pascal - FreeMem(pointer) wirft: SIGABRT???

Hallo liebe Community,

ich habe ein Problem mit dem Freigeben von Speicher in Pascal:

Was ich derzeit versuche ist, einen "Haupt-Zeiger" ein paar stellen im Speicher zu verschieben und den neuen zeiger, also den verschobenen, in einen
anderen Pointer zwischen zu speichern, wenn ich diesen Pointer dann freigeben möchte mit: FreeMem(pointer), bekomme ich eine Exception: SIGABRT

Code:

Quellcode

1
2
curr_item_ptr := f_main_ptr + index;
FreeMem(curr_item_ptr);\0


f_main_ptr hat eine andere Adresse als curr_item_ptr ----> ist auch gut so :D

und wenn ich Free(f_main_ptr) aufrufe, klappt das, nur bei FreeMem(curr_item_ptr) wirft er diese Exception!

Ich wäre euch super dankbar leute :/ Stehe auf dem Schlauch..

Liebe Grüße

PF

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

12.12.2016, 17:51

Normalerweise kannst du Funktionen zur Freigabe von Speicher nur mit exakt den Adressen aufrufen, die du von der entsprechenden Funktion zur Reservierung von Speicher bekommen hast. Du kannst nicht nur einen Teil des Speichers wieder freigeben, sondern nur alles oder nichts. Was willst du denn überhaupt erreichen, also was ist der Sinn dahinter?

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

3

12.12.2016, 17:55

Hört sich für mich vollkommen korrekt an. Was erwartest du denn für ein Verhalten?
@D13_Dreinig

4

12.12.2016, 19:00

Danke @David,

das klingt plausibel!

5

12.12.2016, 19:39

Achso, ja der Sinn^^

Ich habe eine eigene Arrayklasse geschrieben, also um ein herkömmliches Array zu implementieren und es klappt soweit auch alles :thumbsup: :thumbsup:

Und nun, hatte ich vor eine eigene "Delete" Funktion zuschreiben, in dem ich das zu löschende Element im Array lokalisiere (Adresse + Variable) und es in einem Pointer zwischenspeichere.

Dann war die Idee: Einfach diesen "tmp_ptr" frei zugeben, um damit das Löschen zu realisieren.

Und ja, intern in der Array-klasse hätte ich die Verantwortung natürlich für die korrekten Indizes übernommen, dass insofern es nicht möglich ist, auf den gelöschten Index zuzugreifen, weiß ich^^

Aber der Knackpunkt ist oben beschrieben.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

6

13.12.2016, 00:24

Das könnte sowieso nicht funktionieren, da du nirgendwo die Größe des freizugebenden Bereichs übergeben kannst, sondern nur eine einzige Adresse.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

7

13.12.2016, 05:56

Irritierenderweise kann man das: FreeMem(var p: Pointer; Size: Cardinal)

Laut Dokumentation wird der Parameter aber ignoriert. :)
@D13_Dreinig

Werbeanzeige