![]() |
Delphi-Version: XE2
Variable ist möglicherweise nicht initialisiert worden
Hey,
ich habe mal ne Frage zu der Compilerwarnung: [DCC Warnung] QixList.pas(51): W1036 Variable 'help' ist möglicherweise nicht initialisiert worden
Delphi-Quellcode:
In welchem Fall kann das denn passieren? Ich sehe da keinen offensichtlichen Fehler...
function AddSpark(aData : TSpark) : EList;
var help : PSparkList; begin AddSpark := LOK; try new(help); inc(booked); help^.Data := aData; help^.pNext := pRoot; pRoot := help except on EOutOfMemory do AddSpark := LNoMemory else AddSpark := LUndefined; if help<>nil then begin dispose(help); dec(booked) end end end; lg Looper |
AW: Variable ist möglicherweise nicht initialisiert worden
Wenn es in der ersten Zeile des try-Blocks zu einer Exception kommt springt er in den except-Abschnitt und dann ist help nicht initialisiert.
|
AW: Variable ist möglicherweise nicht initialisiert worden
Falls bei
Delphi-Quellcode:
etwas schief geht würde help undefiniert sein.
new(help); inc(booked);
|
AW: Variable ist möglicherweise nicht initialisiert worden
In Welcher Codezeile kommt denn diese Meldung?
Delphi-Quellcode:
Var-Parameter und damit auch das New werden nicht so beachtet.
var
help : PSparkList; begin ... pRoot := help; Denn innerhalb der der Prozedur, kann man nicht sicherstellen, daß dort wirklich was zugewiesen wird. (bei Out-Parametern könnte das anders aussehn) Immerhin kann ja innerhalb der Prozedur auch nur lesend, bzw. erstmal Lesend und dann schreibend auf diese Variable zugegriffen werden. Für den Compiler fehlt praktisch eine vorherrige Zuweiseung
Delphi-Quellcode:
, vor dem ersten potentiellen Lesezugriff darauf.
help := ...;
Und zu der Aussage von DanielProgramming:
Delphi-Quellcode:
Help wurde eventuell niemals initialisiert, wenn etwas passiert.
try
... except ... if help<>nil then |
AW: Variable ist möglicherweise nicht initialisiert worden
Okay. Aber ist das explizit für meinen Code ein Problem?
Ich will ja nur sicher gehen, dass der reservierte Speicher auf jeden Fall wieder freigegeben wird. Wenn ich mir jetzt mit new(help) Speicher reserviere ist der Inhalt noch nicht initialisiert, aber ich möchte in einem Fehlerfall ja auch nur wieder den Speicher freigeben. Somit kann ich diese Warnung doch ignorieren oder sehe ich das falsch. |
AW: Variable ist möglicherweise nicht initialisiert worden
Dann nimm try-finally.
|
AW: Variable ist möglicherweise nicht initialisiert worden
Das bringt auch nichts, da der Speicher ja nur im Fehlerfalle freigegeben werden soll, oder? Evtl. sollte man vor dem try einfach help auf nil setzen.
|
AW: Variable ist möglicherweise nicht initialisiert worden
Zitat:
Und mit dem Tipp läuft das dann natürlich auch einwandfrei. Danke |
AW: Variable ist möglicherweise nicht initialisiert worden
* Result ist irgendwie verständlicher, als soein Funktionsname. (vorallem kann man da auch Lesend drauf zugreifen)
* booked vor dem New setzen, da es bei OutOfMemory nie hinzugezählt würde, aber im Except wir immer abgezogen.
Delphi-Quellcode:
Aber im Prinzip seh ich hier nur eine Exceptionquelle.
function AddSpark(aData : TSpark) : EList;
var help : PSparkList; begin help := nil; try Inc(booked); New(help); help^.Data := aData; help^.pNext := pRoot; pRoot := help; Result := LOK; except on EOutOfMemory do Result := LNoMemory else Result := LUndefined; if Assigned(help) then begin Dec(booked); Dispose(help); end; end; end; Das Andere sind wohl alles nur "harmlose" Typen/Variablen.
Delphi-Quellcode:
Standardmäßig braucht man bei help^.Data nicht manuell dereferenzieren. (Delphi macht es bei help.Data von alleine)
function AddSpark(aData : TSpark) : EList;
var help : PSparkList; begin try New(help); Inc(booked); help^.Data := aData; help^.pNext := pRoot; pRoot := help; Result := LOK; except Result := LNoMemory; end; end; // oder von mir aus auch so function AddSpark(aData : TSpark) : EList; var help : PSparkList; begin try New(help); except Exit(LNoMemory); // Result := LNoMemory; Exit; end; Inc(booked); help^.Data := aData; help^.pNext := pRoot; pRoot := help; Result := LOK; end; |
AW: Variable ist möglicherweise nicht initialisiert worden
Zitat:
Zitat:
EDIT Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:09 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