AGB  ·  Datenschutz  ·  Impressum  







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

Befehlszeile ausführen

Ein Thema von Landogar-Garuno · begonnen am 1. Dez 2010 · letzter Beitrag vom 1. Dez 2010
Antwort Antwort
Benutzerbild von himitsu
himitsu

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

AW: Befehlszeile ausführen

  Alt 1. Dez 2010, 09:40
Nee, wieso soll es da knallen?
Free prüft ja auf NIL und überspringt dann das Freigeben.
(unter Anderem soll man darum ja auch vorzugsweise .Free und nicht direkt .Destroy aufrufen)
[add]ahhhh, wo kommen denn die Beiträge her ... und DeddyH zustimm[add/]

Nja, es geht mehr ums Prinzip. Klar kann bei diesem einfachen TStringLst.Create nicht viel passieren und wenn, dann ist wirklich Vieles schon verloren, aber was ist, wenn in dem Create mal mehr passiert?

Beispiel: fs := TFileStream.Create('dateina.me', ...); ... wenn es hier z.B. wegen fehlenden Rechten knallt und dann diese Fehlermeldung durch die nachfolgend auftretende Speicherzugriffsverletzung verdeckt wird, dann hat man ein Problemchen.
(bei dieser lokalen Variable ist die Chance immerhin nur 1 zu 4 Milliarden, daß diese Variable zufällig schon nil ist)
OK, der Debugger hält vielleicht noch bei der ersten Exception kurz an, aber ohne Debugger sieht man nur noch die letzte Exception.


[add]
Auch wenn bei soeinem einfachem und dennoch extremen Einzelfall eh alles egal ist,
sollte man dennoch eine einheitliche Behandlung implementieren.
Wenn man es immer so/gleich macht, dann vergißt man es an anderen Stellen nicht, wo es dann mal nicht mehr egal sein könnte.

PS: Das Zweite ist nur eine kleine zusätzliche Zeile, ein einziger extrem kurzer ASM/CPU-Befehl und belegt nur sehr wenige Bytes in der EXE, aber es kann eine sehr große positive Wirkung haben.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 1. Dez 2010 um 09:47 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Befehlszeile ausführen

  Alt 1. Dez 2010, 10:01
Wenn schon ein tstringlist.create abstürzt, wird es sowieso bei nächster Gelegenheit knallen. Derartige Fehler abfangen und weitermachen, als wäre nichts gewesen, bringt doch gar nichts.
Nicht?
Es kann doch zufällig danach noch was freigegeben werden und dann paßt es wieder.

Delphi-Quellcode:
errors := nil;
output := GetMem(1000000000); // grade noch genug
try
  errors := GetMem(100); // das war jetzt zuviel
  ...
finally
  FreeMem(errors); // hier könnte es ohne :=nil nochmals knallen
  FreeMem(output);
end;
Jetzt könnte es ab dem nächten Except (von einem Try-Except) weitergehn, da wieder genug Speicher frei ist.
Ohne das :=nil könnte es aber passieren, daß es beim FreeMem(errors) nochmal knallt, dabei die ursprüngliche Fehlerursache/-adresse verfälscht und FreeMem(output) ganicht mehr ausgeführt wird.

du siehst ... ohne das :=nil wird es nur schlimmer und mit kann es besser werden



[add]
Zitat:
Delphi-Quellcode:
output := TStringList.Create;
errors := TStringList.Create;
try
  ...
finally
  output.free;
  errors.free;
end;
bitte nicht ... wenn es hier bei errors knallt, dann wird output nicht freigegeben.
Ein Therapeut entspricht 1024 Gigapeut.
  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 08:39 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-2025 by Thomas Breitkreuz