AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Lazarus, Problem mit TMemoryStream

Ein Thema von Gutelo · begonnen am 1. Sep 2014 · letzter Beitrag vom 1. Sep 2014
Antwort Antwort
Gutelo

Registriert seit: 29. Sep 2013
152 Beiträge
 
#1

Lazarus, Problem mit TMemoryStream

  Alt 1. Sep 2014, 00:08
Hallo,

ich habe eine Frage bezueglich TMemoryStream unter Lazarus. Eine Instanz wurde erstellt mittels ms := TMemoryStream.Create;

Wenn ich zweimal hintereinander ms.Free aufrufe, dann haengt sich das Programm auf. Wieso ist das so? Zwar ist die Instanz nach dem ersten ms.Free nicht mehr vorhanden, aber so wie ich das verstanden habe sollte ein Object.Free auch dann arbeiten wenn der Pointer nil ist, d.h. vorher auf nil pruefen, oder nicht?

Gutelo
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.316 Beiträge
 
Delphi 12 Athens
 
#2

AW: Lazarus, Problem mit TMemoryStream

  Alt 1. Sep 2014, 00:21
Weil man das nicht macht?
Ja macht es, also auf nil prüfen, aber Free setzt nichts auf nil.
Und nein, das ist nicht nur ein Lazarusproblem.

Wenn man nach dem Free nochmal auf den Instanzzeiger zugreifen will/muss, dann sollte man FreeAndNil verwenden.


Probleme haben viele, aber wo ist das "Free" im Titel?
PS: Das ist kein Problem vom Lazarus, sondern vom Compiler, also FreePascal, und das braucht man nicht in den Titel schreiben, sondern es gibt ein Präfix dafür in der Liste, oder du sgibst einfach das Lazarus mal in deinem Forenprofil an.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 1. Sep 2014 um 00:25 Uhr)
  Mit Zitat antworten Zitat
Gutelo

Registriert seit: 29. Sep 2013
152 Beiträge
 
#3

AW: Lazarus, Problem mit TMemoryStream

  Alt 1. Sep 2014, 00:34
Mein Hauptproblem ist, dass ich nicht weiss wie ich pruefen soll, ob die Instanz schon existiert.

Ich dachte eigentlich, dass Assigned(TObject) genau das macht, aber wenn ich ein "if Assigned(ms) then ms.Free;" durchfuehre dann haengt sich das Programm ebenfalls auf.

Gutelo
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Lazarus, Problem mit TMemoryStream

  Alt 1. Sep 2014, 00:41
Dann schau doch mal nach, was Assigned macht.

Assigned prüft lediglich, ob die Referenz-Variable den Wert nil hat.
Aus, basta, fertig.
Delphi-Quellcode:
function Assigned( Obj : TObject ) : Boolen;
begin
  Result := Obj <> nil;
end;
Steht da etwas anderes drin als nil , dann liefert Assigned true zurück.

Es wird nicht geprüft, ob an der angegebenen Referenz eine gültige Instanz ist!

Setze einfach nach dem Free den Wert der Referenz-Variablen auf nil und schon kannst du problemlos mit Assigned prüfen.

Du kannst dafür auch FreeAndNil benutzen, das wie folgt arbeitet:
Delphi-Quellcode:
procedure FreeAndNil( var Obj : TObject );
begin
  Obj.Free;
  Obj := nil;
end;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo ( 1. Sep 2014 um 00:46 Uhr)
  Mit Zitat antworten Zitat
Gutelo

Registriert seit: 29. Sep 2013
152 Beiträge
 
#5

AW: Lazarus, Problem mit TMemoryStream

  Alt 1. Sep 2014, 00:46
Was ist denn der richtige Weg zu pruefen ob sich hinter einer Variablen ein instantiiertes Objekt einer Klasse befindet?

if myObject is TObject then ... ?
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Lazarus, Problem mit TMemoryStream

  Alt 1. Sep 2014, 00:48
Was ist denn der richtige Weg zu pruefen ob sich hinter einer Variablen ein instantiiertes Objekt einer Klasse befindet?

if myObject is TObject then ... ?
Es gibt keinen Weg dafür!
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:30 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz