Prüfen ob Dispose(...) ausgeführt wurde

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Mathias
Beiträge: 6167
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Prüfen ob Dispose(...) ausgeführt wurde

Beitrag von Mathias »

Kann ich irgendwie prüfen, ob "pint " frei gegeben wurde ?

Code: Alles auswählen

var
  pint: PInteger;
begin
  pint := new(PInteger);

  // ---
  Dispose(pint);  // Ist in fremden Code daher habe ich keinen Einfluss
  // ---

  if not Freigegeben(pint) then begin
    Dispose(pint);
  end;
Es gibt Assigned(pint);, aber dies funktioniert nur solange bis Speicher mit New() für pint reserviert wird, ausser man macht folgendes:

Code: Alles auswählen

  Dispose(pint);
  pint := nil;
Nur habe ich auf dies keinen Einfluss, da Dispose(pinit) in fremdem Code stehen könnte.


Es geht mit um den hier festgestellten Bug.
viewtopic.php?f=19&t=14305
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Prüfen ob Dispose(...) ausgeführt wurde

Beitrag von Warf »

Nö, mit dem normalen speichermanager ist das nicht möglich.
Beispiel:

Code: Alles auswählen

var
  p1: PInteger;
  p2: PSingle;
begin
  new(p1);
  p1^ := 42;
  dispose(p1);
  new(p2);
  p2^ := 3.14;
  WriteLn(Pointer(p1) = Pointer(p2)); 
end.
Ergibt true, weil der speicherbereich der von p1 benutzt wurde direkt wiederverwendet wurde für p2, somit ist p1 also nach dem new tatsächlich ein valider pointer, nur halt statt seinem eigenen integer zeigt der jetzt auf nen fremden float. Es ist also ein valider pointer, nur halt nicht der richtige, und das ist eine semantische unterscheidung die technisch nicht einfach so überprüft werden kann

Antworten