![]() |
Re: SetLength(dyn. array, 0) vs. Finalize() vs. nil
Zitat:
Das hier diskutierte kommt mir mehr so vor:
Delphi-Quellcode:
So jetzt kann ich mir sicher sein, dass MyObj auch wirklich freigegeben wurde.
MyObj := TMyObj.Create;
... MyObj.Free; MyObj := nil; MyObj.Free; MyObj := nil; MyObj.Free; MyObj := nil; MyObj.Free; MyObj := nil; MyObj.Free; MyObj := nil; MyObj.Free; MyObj := nil; Finalize muss man nur Aufrufen, wenn man auf New und Dispose bei Zeigern auf Records verzichtet, also die Compile-Magic umgeht.
Delphi-Quellcode:
Bei dynamischen Arrays übernimmt der Compiler genauso wie bei Strings automatisch die Initialisierung und Finalisierung. Da muss man nichts selbst einfügen. Das Delphi 4 da noch einen Bug hat, der von einem Update dann aber behoben wurde (wenn ich mich recht erinnere), heißt noch lange nicht, dass Delphi 5, 6, 7, 8, 2005 diesen Bug auch haben.
var P: PMyRec;
begin New(P); ... Finalize(P); FreeMem(P); // Statt Dispose gleich direkt freigeben, macht zwar keinen Sinn, aber wers so will end; |
Re: SetLength(dyn. array, 0) vs. Finalize() vs. nil
Moin, Ich habe deinen Satz (mit "Feier" usw.) zwar nicht verstanden, aber dafür den Code :-D Nur woher weiß SetLength(Items,0) anfangs, dass genau 8 Bytes pro TItem benötigt werden? Entstehen diese 8 bzw. 7 Bytes nicht erst bei der Zuweisung der einzelnen Strings?
@jbg: Und noch eine andere Meinung...Ich habe ja extra die unterschiedlichen Ansichten am Anfang zitiert, um meine Verwirrung darzustellen. Einer der Profis meint dies, der andere dementiert das wieder und interpretiert etwas anderes in die Delphi-Hilfe hinein... |
Re: SetLength(dyn. array, 0) vs. Finalize() vs. nil
Zitat:
Das gilt (so weit ich weiß) sogar für verschachtelte Typen, also für Arrays von einem Record das jeweils wieder ein dynamisches Array enthält. |
Re: SetLength(dyn. array, 0) vs. Finalize() vs. nil
Zitat:
Ausgelöst durch den Beitrag von jbg habe ich mich mit deinem TestArrayT und TestArrayP intensiver beschäftigt. Zitat:
Zitat:
In meinem vorigen Beitrag habe ich versucht zu erklären, warum ein Finalize(v, 10) nach einem SetLength(v, 0) fehl am Platze ist (wer zu spät kommt, der kommt nach der Feier - alte Redensart). Das Beispiel ist frei von Seiteneffekten und hoffentlich leicht nachvollziehbar gewesen. Niemand sollte sich verplichtet fühlen dem Beispiel zu folgen, wenn er es nicht verstanden hat oder gar einen besseren Weg kennt. Freundliche Grüße vom marabu PS: Auf einen Fehler von mir hat mich tommie-lie per PN aufmerksam gemacht: Zitat:
Danke, Thomas (tommie-lie). |
Re: SetLength(dyn. array, 0) vs. Finalize() vs. nil
Zitat:
Zitat:
|
Re: SetLength(dyn. array, 0) vs. Finalize() vs. nil
Zitat:
|
Re: SetLength(dyn. array, 0) vs. Finalize() vs. nil
@jbg: Jep, das ist ja auch klar. Ich gebe ja durch SetLength() nur den Speicher für die Pointer frei, nicht aber den Speicherbereich, den der record einnimmt.
@marabu: Es handelte sich hier um ein Missverständnis. Ich dachte anfangs, SetLength() "weiß" bereits VOR der der Zuweisung der einzelnen string-Variablen, dass diese mit 6 Bytes Inhalt (="Name-3") + 1 Byte string-Zeiger + Byte Integer-Wert aus dem record initialisiert werden. Meine völlig falsche Selbsterklärung, wie diese 8 Bytes zustande kommen, gehört nun der Vergangenheit an und ich weiß es jetzt besser. Vielen Dank an alle, die meine Verwirrungen beseitigen und mir beim Erweitern der Grundkenntnisse helfen konnten! Bis zum nächsten Problem, Nogge :wink: |
Re: SetLength(dyn. array, 0) vs. Finalize() vs. nil
Zitat:
Zitat:
|
Re: SetLength(dyn. array, 0) vs. Finalize() vs. nil
Ja.
Delphi-Quellcode:
function New(Size: Longint; TypeInfo: Pointer): Pointer;
begin GetMem(Result, Size); if Result <> nil then Initialize(Result, TypeInfo); end; procedure Dispose(P: Pointer; TypeInfo: Pointer); begin Finalize(P, TypeInfo); FreeMem(P); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:12 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