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; 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
mkinzler 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
walter_b hat folgendes geschrieben: |
Grenzgaenger 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
mkinzler 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
mkinzler hat folgendes geschrieben: |
| Mit dieser Funktion wird Speicher reserviert |
Den man nachher natürlich auch wieder freigeben muss!
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!