Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Access violation mit free??? (https://www.delphipraxis.net/35928-access-violation-mit-free.html)

tn249 13. Dez 2004 20:33


Access violation mit free???
 
Hi,

hier das wichtigeste aus meinem unit;
Code:
var
  mainForm: TmainForm;
  myfile: TFileStream;

implementation      

{$R *.dfm}

procedure TmainForm.Button1Click(Sender: TObject);
begin
  if (OpenDialog1.Execute) then
    begin
      try
        myfile := TFileStream.Create(OpenDialog1.FileName, fmOpenRead and fmShareDenyWrite);
      except
        myfile.Free;
      end;
    end;
end;

procedure TmainForm.Button2Click(Sender: TObject);
begin
  myfile.Free;
end;
wenn der zweite button gedrückt wird, bevor eine datei geladen wird passiert kein fehler.

wenn ich eine datei lade, sie dann schließe und hinterher nochmal den 2. button drücke bekomme ich eine access violation

ich frage mich warum, da ich in der hilfe folgendes gefunden habe;
Zitat:

Destroys an object and frees its associated memory, if necessary.

procedure Free;

Description

Use Free to destroy an object. Free automatically calls the destructor if the object reference is not nil. Any object instantiated at runtime that does not have an owner should be destroyed by a call to Free so that it can be properly disposed of and its memory released. Unlike Destroy, Free is successful even if the object is nil; so if the object was never initialized, Free won’t result in an error. [...]
kann mir das jemand erklären
würde mich sehr um hilfe freuen

MfG
tn249

PS: kann man vorher irgendwie überprüfen, ob die instanz schon freigegeben wurde?

SirThornberry 13. Dez 2004 20:39

Re: Access violation mit free???
 
wenn du einfach nur Free aufrufst wird das Object zwar frei gegeben aber der Objectzeiger nicht auf nil gesetzt. Wenn du jetzt erneug free aufrufst kracht es. Wenn du den Objeczeiger nach dem Free auf nil setzt würde das nicht passieren. Oder du rufst anstelle von "Free" gleich "FreeAndNil" auf

Luckie 13. Dez 2004 20:40

Re: Access violation mit free???
 
Zitat:

Zitat von tn249
wenn ich eine datei lade, sie dann schließe und hinterher nochmal den 2. button drücke bekomme ich eine access violation

Wo schließt du die Datei? Der Exceptblock wird nur im Fehlerfall ausgeführt. Ersetzt das except durch finally. Und gib das mal mit Delphi-Referenz durchsuchenFreeAndNil frei, dann kannst du auchmit Assign gucken, ob es noch eine Instanz gibt.

Und warum eine globale Variable?

DennyC 13. Dez 2004 20:49

Re: Access violation mit free???
 
Zitat:

Zitat von tn249
wenn ich eine datei lade, sie dann schließe und hinterher nochmal den 2. button drücke bekomme ich eine access violation

Was meinst Du mit "sie dann schlie0e"?

Denny

tn249 13. Dez 2004 20:50

Re: Access violation mit free???
 
Zitat:

Zitat von Luckie
Zitat:

Zitat von tn249
wenn ich eine datei lade, sie dann schließe und hinterher nochmal den 2. button drücke bekomme ich eine access violation

Wo schließt du die Datei? Der Exceptblock wird nur im Fehlerfall ausgeführt.

der except is ja nur für den fehler da, das was ich oben als schließen bezeichnet hatte, meinte ich mit auf den 2. button drücken

das freeandnil werde ich mal ausprobieren

globale variable: wie hättest du es denn gelöst von den beiden procedures auf die datei zuzugreifen?


vielen dank für eure hilfe

MfG
tn249

edit: :dp:

SirThornberry 13. Dez 2004 20:51

Re: Access violation mit free???
 
anstelle von Globalen Variablen könntest du es einfach in den Private-Teil der Klasse schreiben (also direkt unter "private"

tn249 13. Dez 2004 20:55

Re: Access violation mit free???
 
juhui es funktioniert

Code:
myfile.Free;
myfile := nil;
bloß FreeAndNil kennt er nicht und ich kann nicht nachschauen warum, weil meine DH an der stelle im Ar*** ist :wall:

MfG
tn249

tn249 13. Dez 2004 20:56

Re: Access violation mit free???
 
Zitat:

Zitat von SirThornberry
anstelle von Globalen Variablen könntest du es einfach in den Private-Teil der Klasse schreiben (also direkt unter "private"

gute idee, thx

SirThornberry 13. Dez 2004 20:57

Re: Access violation mit free???
 
FreeAndNil macht nix anderes als was du auch gemacht hast. Also erst Free aufrufen und dann das ganze auf "nil" setzen

Sanchez 13. Dez 2004 20:59

Re: Access violation mit free???
 
Hallo,
FreeAndNil befindet sich übrigens in der Unit sysutils. Normalerweise solltest du die schon automatisch in den uses haben.
Aber es macht sowieso nicht merh als zuerst Free und danach nil zuweisen.

grüße, daniel


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:29 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz