Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Undeclared Identifier: Free => Warum?


walter_b - So 27.07.08 12:38
Titel: Undeclared Identifier: Free => Warum?
Ich habe mal wieder so ein richtiges Noob-Problem, allerdings habe ich einmal mehr keine Ahnung, woran es liegen könnte.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
function Hanspeter(): Integer;
var
  hans: Array[0..7] of Byte;
  prev: Word;
  I, Y: Byte;
begin
  try
    for x:=0 to 7 do
      hans[Y]:=0;

    for I:=0 to 7 do
      begin
        prev:=I*2;
      end;
    Result:=prev;
  finally
    Free;

  end;
end;


Er meldet mir "Undeclared Identifier: Free". Ich versteh das nicht, in der Funktion davor hat es so auch funktioniert. Kann mir jemand helfen?


Edit: Ja, ich weiss, dass der Code unsinnig ist...


Delete - So 27.07.08 12:39

ganz einfach, du hast kein objekt auf welches free angewendet werden kann.

normal heists

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
obj := tObject.create;  //das hier fehlt bei dir
try
 ....
finally
 obj.free;
end;


mkinzler - So 27.07.08 12:40

Die Funktion davor war dann wohl eine Methode.


walter_b - So 27.07.08 12:41

Ach so, vielen Dank. Aber etwas verwundert mich. Bei der andere Funktion mit Free kommt nach einer gewissen Anzahl Aufrufen trotzdem: Raise out of memory. Woran liegt das? Immerhin benutze ich ja Free!?


Delete - So 27.07.08 12:42

user profile iconmkinzler hat folgendes geschrieben:
Die Funktion davor war dann wohl eine Methode.


auch bei einer methode, wäre das hier unsinnig. da ein objekt sich nicht selbst freigeben kann...


mkinzler - So 27.07.08 12:42

Zitat:
In diesem Falle habe ich hier ein Objekt, welches zerstört wird?
Ja. Ein tempräres Objekt das du mit TCipher_1DES.Create erzeugt hast


Delete - So 27.07.08 12:43

user profile iconwalter_b hat folgendes geschrieben:
user profile iconGrenzgaenger hat folgendes geschrieben:
ganz einfach, du hast kein objekt auf welches free angewendet werden kann.



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
function Jakob(): String;
begin
  with TCipher_1DES.Create do
  try
    Init(Key);
    Result := EncodeBinary();
  finally
    Free;
  end;
end;


In diesem Falle habe ich hier ein Objekt, welches zerstört wird?


in diesem falle hast du das objekt TCipher_1DES zerstört, für welches du einen temp. objektzeiger angelegt hast.


walter_b - So 27.07.08 12:44

Und warum kommt nach einer gewissen Anzahl Aufrufe trotzdem Raise out of memory, auch wenn ich es jedes mal wieder mit Free zerstöre?


Delete - So 27.07.08 12:46

weil du wohl noch irgendwo andere objekte hast, welche du zwar erstellst und den speicher hierfür reservierst, diesen aber nicht mehr freigibst.


walter_b - So 27.07.08 13:01

Und dieses Objekt muss immer mit .Create aufgerufen werden?


mkinzler - So 27.07.08 13:04

Das ist der Konstruktor, welcher eine neue Instanz erzeugt.


walter_b - So 27.07.08 13:08

user profile iconmkinzler hat folgendes geschrieben:
Das ist der Konstruktor, welcher eine neue Instanz erzeugt.


Hm... Ich verstehe das nicht. Jetzt läuft mir die Datenbank plötzlich wegen eines Out of Memory nicht mehr, weil ich jetzt die Funktion öfters aufrufe. Habe sonst nirgends irgendwo noch einen Constructor gefunden.

Die Fehlermeldung steht immer bei der Funktion von ReallocMem(). Könnte diese Funktion etwas damit zu tun haben?


mkinzler - So 27.07.08 13:31

Mit dieser Funktion wird Speicher reserviert


Boldar - So 27.07.08 14:24

user profile iconmkinzler hat folgendes geschrieben:
Mit dieser Funktion wird Speicher reserviert



Den man nachher natürlich auch wieder freigeben muss!