Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Ist TRegistry.Free nach TRegistry.Create nicht notwendig? (https://www.delphipraxis.net/152788-ist-tregistry-free-nach-tregistry-create-nicht-notwendig.html)

Matze 7. Jul 2010 05:52

Delphi-Version: 2005

Ist TRegistry.Free nach TRegistry.Create nicht notwendig?
 
Hallo zusammen,

in der Online-Hilfe zu "TRegistry.OpenKey" steht u.a. folgender Code:
Delphi-Quellcode:
procedure TForm3.DeleteFromRegBtnClick(Sender: TObject);
var
  reg : TRegistry;
begin
  reg := TRegistry.Create(KEY_WRITE);
  reg.RootKey := HKEY_LOCAL_MACHINE;

  reg.DeleteKey('Software\\MyCompanyName\\MyApplication');
  reg.DeleteKey('Software\\MyCompanyName');

  reg.CloseKey();
end;
Ich bin der Meinung, ein
Delphi-Quellcode:
reg.Free
bzw.
Delphi-Quellcode:
FreeAndNil(reg)
ist erforderlich, um MemoryLeaks zu vermeiden. Im 2. Code-Abschnitt darüber ist es jedoch genauso programmiert wie im hier eingefügten.
Sowas ist mir dort schon mehrfach aufgefallen.

Ist die Online-Hilfe von Embarcadero so schlecht?

Jeder Programmieranfänger oder auch Fortgeschrittene, wird diese Hilfe nutzen und sich an den Beispielen orientieren. Und da man sich i.d.R. auf die Hilfe verlässt, merkt man sich das Vorgehen und macht es zukünftig falsch.

mkinzler 7. Jul 2010 06:16

AW: Ist TRegistry.Free nach TRegistry.Create nicht notwendig?
 
Ich würde das auch in eine try...finally packen

hoika 7. Jul 2010 06:30

AW: Ist TRegistry.Free nach TRegistry.Create nicht notwendig?
 
Hallo,

Zitat:

Ist die Online-Hilfe von Embarcadero so schlecht
Fehler machen alle.

Aber stimmt schon,
gerade mit D2009/D2010 sollten die mal ihre Beispiele mit FastMM4-FullDebug prüfen.

Vielleicht hat das ja jemand des C++-Teams 1 zu 1 nach Delphi übersetzt (in C+ gibt es Auto-Pointer, die aber hier auch nicht verwendet worden sind)

Und ja, es fehlt das reg.Free;

Delphi-Quellcode:
reg:= TRegistry.Create;
try
finally
  reg.Free;
end;

Heiko

himitsu 7. Jul 2010 07:11

AW: Ist TRegistry.Free nach TRegistry.Create nicht notwendig?
 
CloseKey schließt nur den Schlüssel
und TRegistry.Free ist natürlich dennoch für's Freigeben des Objekts nötig.

Allerdings könnte man sich hier
Delphi-Quellcode:
var
  reg : TRegistry;
begin
  reg := TRegistry.Create(KEY_WRITE);
  reg.RootKey := HKEY_LOCAL_MACHINE;

  reg.DeleteKey('Software\\MyCompanyName\\MyApplication');
  reg.DeleteKey('Software\\MyCompanyName');

  reg.CloseKey;
  red.Free;
end;
das CloseKey sparen, da es in Free mit enthalten ist.
(vielleicht haben die in der Eile einfach nur das Falsche weggelassen :stupid: )


PS: Ein Schreibzugriff auch HKEY_LOCAL_MACHINE als Beispiel?
Ein normaler Benutzer hat da doch keine Rechte mehr dafür, seit Vista/Seven. :shock:

Luckie 7. Jul 2010 08:25

AW: Ist TRegistry.Free nach TRegistry.Create nicht notwendig?
 
Zitat:

Zitat von himitsu (Beitrag 1033897)
Ein normaler Benutzer hat da doch keine Rechte mehr dafür, seit Vista/Seven. :shock:

Seit NT, 2000, XP!

himitsu 7. Jul 2010 08:27

AW: Ist TRegistry.Free nach TRegistry.Create nicht notwendig?
 
Zitat:

Zitat von Luckie (Beitrag 1033934)
Seit NT, 2000, XP!

Schon klar, aber vor Vista waren doch alle Admins. :roll:

Luckie 7. Jul 2010 08:37

AW: Ist TRegistry.Free nach TRegistry.Create nicht notwendig?
 
Ich nicht. ;)

DeddyH 7. Jul 2010 10:24

AW: Ist TRegistry.Free nach TRegistry.Create nicht notwendig?
 
Die Beispiele in der Online-Hilfe sind schon immer teilweise sehr unelegant/fehlerbehaftet gewesen (Objekte nicht freigegeben, unübersichtliche Verwendung von with, Vergleiche auf true, etc.). Man kann sie nur als Anschauungsbeispiel für die Verwendung der speziellen Routine verwenden (wozu sie ja auch gedacht sind), sollte sie aber nicht unbedingt als das NonPlusUltra der Programmierkunst verstehen.

Christian Seehase 7. Jul 2010 11:05

AW: Ist TRegistry.Free nach TRegistry.Create nicht notwendig?
 
Zitat:

Zitat von himitsu (Beitrag 1033897)
Allerdings könnte man sich hier
...
das CloseKey sparen, da es in Free mit enthalten ist.

Aber Vorsicht.
Das geht nur, wenn man nur einen Key geöffnet hatte, denn es wird nur der jeweils letzte geöffnete bei Free geschlossen.
Zu jedem Open also am Besten auch ein Close (wie sich das gehört ;-))

Matze 7. Jul 2010 11:43

AW: Ist TRegistry.Free nach TRegistry.Create nicht notwendig?
 
Zitat:

Zitat von mkinzler (Beitrag 1033895)
Ich würde das auch in eine try...finally packen

Stimmt! Das ist mir noch gar nicht aufgefallen.

Dann könnte man "Free" im vorliegenden Beispiel weg lassen, auch wenn ich es anders schöner finde. Gerade bei einer Erweiterung des Codes muss "Free" ggf. ergänzt werden und sowas vergisst man dann leicht.
Meiner Meinung nach sollten die Beispiele jedoch allgemein gehalten werden. Normalerweise guckt man kurz nach, wie es geht und überträgt es auf seine Aufgabenstellungen.

Naja gut, dann werde ich nur noch auf die OH verweisen, wenn ich die Beispiel-Codes davor angesehen habe.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:25 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