![Delphi Developer Debate FreeAndNil | Embarcadero RAD Studio Delphi C++Builder Blogs delphi developer debate freeandnil 2](https://i0.wp.com/blogs.embarcadero.com/wp-content/uploads/2022/06/Delphi-Developer-Debate-FreeAndNil-9012156.jpg?resize=1140%2C694&ssl=1)
Sie sind mit FreeAndNil() vertraut , aber verwenden Sie es? Wie oft? Verwenden Sie es richtig? Wie bei den meisten Dingen in der Softwareentwicklung ist es ein kompliziertes Thema. Mal sehen, was die Experten zu sagen haben. Wir werden die Details in einer freundlichen Diskussion mit einigen Ihrer Lieblings-MVPs erörtern.
- Dieser Blogbeitrag enthält die Wiederholung, Folien und mehr nach dem Webinar.
Die Umfrage sagt…
Wenn Sie sich für das Webinar anmelden , haben wir eine kurze Umfrage eingefügt, um zu sehen, wie Sie zu diesem Thema stehen. Während des Webinars werden wir den allgemeinen Konsens mit dem unseres MVP-Expertengremiums vergleichen.
Noch mehr MVPs haben sich zu diesem Thema geäußert, und ich habe einige Teaser, wie sie abgestimmt haben …
Ich habe die Legende, dass die Charts bedeuten, vorerst weggelassen, Sie müssen am Webinar teilnehmen, um die Details zu sehen, aber die Verwendung von FreeAndNil() ist ziemlich gleichmäßig aufgeteilt, wenn wir die Antworten in allgemeine Pro- und Contra-Antworten fassen.
![Use of FreeAndNil by MVPs | Embarcadero RAD Studio Delphi C++Builder Blogs use of freeandnil by mvps](https://i0.wp.com/blogs.embarcadero.com/wp-content/uploads/2022/06/Use-of-FreeAndNil-by-MVPs-7957228.webp?resize=750%2C750&ssl=1)
Wenn wir die Dinge in Details aufschlüsseln, ist es jedoch ein bisschen nuancierter. Nochmal ohne die Legende.
![Detailed Use of FreeAndNil by MVPs | Embarcadero RAD Studio Delphi C++Builder Blogs detailed use of freeandnil by mvps](https://i0.wp.com/blogs.embarcadero.com/wp-content/uploads/2022/06/Detailed-Use-of-FreeAndNil-by-MVPs-6893860.webp?resize=750%2C750&ssl=1)
Zugewiesene Schecks zu machen ist ähnlich, aber etwas ausgeprägtere Unterschiede.
![Use of Assigned by MVPs | Embarcadero RAD Studio Delphi C++Builder Blogs use of assigned by mvps](https://i0.wp.com/blogs.embarcadero.com/wp-content/uploads/2022/06/Use-of-Assigned-by-MVPs-6745112.webp?resize=750%2C750&ssl=1)
![Detailed Use of Assigned by MVPs | Embarcadero RAD Studio Delphi C++Builder Blogs detailed use of assigned by mvps](https://i0.wp.com/blogs.embarcadero.com/wp-content/uploads/2022/06/Detailed-Use-of-Assigned-by-MVPs-7677175.webp?resize=750%2C750&ssl=1)
- F: Ich habe ein Motto: Wenn Sie etwas erschaffen haben, zerstören Sie es am Ende der Routine! Deshalb benutze ich oft FreeAndNIl()!
- A: Es ist nicht immer möglich, aber ich verstehe Ihren Punkt.
- F: Die Instanziierung nach Bedarf ist oft ein vernünftiges Muster, und so haben Sie nichts in Ihrem Zeiger zu sitzen!
- A: Netter Punkt
- F: Programmiert dieser Typ wirklich?
- A: Ja, eine Menge davon. Ja, er ist ein extrem erfahrener Programmierer und sehr respektiert. Ich verspreche es dir 🙂
- F: Nennen Sie Ihr Dummy-Objekt „Nil“ 😛
- A: Guter Punkt.
- F: Ich sitze korrigiert.
- A: lol
- F: nil ist eine großartige Möglichkeit, um zu bestätigen, dass auf nichts verwiesen wird, und wenn Sie mit FreeAndNil IMMER frei arbeiten, wird Ihr Code selbst aufrechterhalten, dass der Zeiger nil ist, wenn er nicht gültig ist, andernfalls ist es immer ein gültiges Objekt.
- A: Es weist nil zu, aber es gibt Zeiten, in denen Sie es nicht nil zuweisen müssen oder wenn Sie möglicherweise etwas anderes verdecken.
- F: Wie kann man sagen „benutze immer Schnittstellen“ und dann auch noch „du solltest nie etwas zerstören, was du nicht erstellt hast“ – völlig widersprüchlich!
- A: Ich sagte: „Wenn Sie können, verwenden Sie Schnittstellen“, und der Punkt beim Codieren für eine Schnittstelle ist, dass die Referenzzählung explizit darauf ausgelegt ist, damit umzugehen.
- F: Es gibt unzählige Anwendungsfälle für Assigned und FreeAndNil. Wenn Sie sie nicht verwenden, verwenden Sie solche Anwendungsfälle entweder nicht oder Sie sind ein schlechter Programmierer. Zu sagen, dass es keinen Grund gibt, sie jemals zu verwenden, oder dass Sie es nicht tun sollten, wenn Sie sie verwenden, ist so völlig falsch.
- A: Ich glaube, was Nick sagt, ist, dass die Verwendung von FreeAndNil- und Assigned-Prüfungen ein Code-Geruch ist, den Sie möglicherweise benötigen, um ein anderes Design zu verwenden. Auch dass die übermäßige Verwendung von FreeAndNil die Dinge verdeckt.
- F: Es gibt viele Situationen, in denen der Code, der für die Freigabe eines Objekts verantwortlich ist, nicht derselbe Code ist, der das Objekt erstellt hat. Das offensichtlichste Beispiel ist ein Speicherverwaltungsmodell mit Referenzzählung.
- A: sicher
- F: Sollte auch eine C++-Entwicklungsansicht erhalten
- A: Ja, einige der MVPs verwenden beides.
- F: F# verwendet den Option-Typ (Vereinigungstyp mit Some und None), um nil zu vermeiden, und meiner Meinung nach erfordert dies Unterstützung in der Sprache (im Typsystem). Bietet Delphi diese Art von Unterstützung?
- A: Nicht, dass ich wüsste …
- F: Warum würden Sie jemals ein Objekt freigeben und den Zeiger darauf nicht auf null setzen?
- A: Wenn die Referenz nicht mehr vorhanden sein wird, weil sie sofort den Geltungsbereich verlässt, ist die Zuweisung nicht erforderlich.
- F: Was Olaf gerade erklärt hat, hat einen Namen: Cargo-Kult-Programmierung
- A: Das war ein Konzept, über das ich in diesem Webinar nachdenken wollte. Ich bin ein großer Anhänger von evidenzbasierter Programmierung. ,Tbh, ich musste nachschlagen, was „Cargo Cult“ bedeutet. Ja, ich stimme zu. Aber wie gesagt, wenn Sie auf eigenen Straßen unterwegs sind oder es sichere Fahrer gibt, dann ist FreeAndNil() jetzt von Nutzen. Was ich in freier Wildbahn sehe, ist jedoch ganz anders. Denken Sie daran, dass ich häufig mit externen Teams mit sehr unterschiedlichen Fähigkeiten zusammenarbeite. Viele von ihnen haben (noch) kein „Save Driver“-Tag
- F: Der Wikipedia-Artikel enthält sogar diese Aussage: „Obsessive und redundante Überprüfungen auf Nullwerte oder das Testen, ob eine Sammlung leer ist, bevor ihre Werte iteriert werden, können ein Zeichen für Cargo-Cult-Programmierung sein.“
- A: lol
- F: Wir verwenden Eigenschafts-Getter-Methoden, die Prüfungen für die Zuweisung einer „f“-Variablen beinhalten, und werden sie bei Bedarf erstellen … manchmal hat die Konstruktion dieser „f“-Variablen Auswirkungen (z. B. eine Anfrage an eine Datenbank oder eine Formularkonstruktion), also wir Konstruieren Sie nicht jede „f“-Variable im Voraus. Und wir sorgen kostenlos dafür, dass nachfolgende Aufrufe an die Eigenschaft ordnungsgemäß verwaltet und initialisiert werden.
- A: sicher
- F: FreeAndNil simuliert die lokalen C++-Variablen unique_ptr. Delphi 10.4 hat endlich RAII eingeführt, also kann es jetzt ein expliziteres unique_ptr-Zeug geben, aber ich muss den Delphi 7-Code pflegen, und deshalb verwende ich weiterhin FreeAndNil als unique_ptr, das fehlt
- A: Es ist immer frustrierend, wenn ich auch mit Code für alte Compiler arbeiten muss.
- F: „Es schadet nicht, einen Zeiger auf ein freigegebenes Objekt gesetzt zu lassen“ – wirklich? Mussten Sie jemals etwas debuggen?
- A: Richtig, ich stimme der Art der fadenscheinigen Verunglimpfung der Programmierkenntnisse nicht zu, aber ich verstehe, was Sie sagen, nämlich „es kann Probleme mit dem Debugger verursachen, also sind Sie anderer Meinung“.
- F: Vielleicht sollten Sie den genauen Unterschied zwischen x.free und FreeAndNil(x) erklären. Ich denke, nicht alle hier sind sich des Unterschieds bewusst
- A: FreeAndNil(x) gibt das Objekt frei, das gleiche wie x.free, aber es setzt auch die Referenz auf nil. Wenn Sie die Referenz nicht auf null setzen, zeigt sie immer noch auf das freigegebene Objekt.
- F: Ein Klassenfeld, das auf ein Objekt verweist, sollte null sein, bis das Objekt erstellt wird, und wenn das Objekt freigegeben wird, sollte es auf null gesetzt werden. Dieses Gespräch ist für mich unsinnig.
- F: Codebeispiele?
- A: Wenn Sie sich die Folien ansehen, gibt es ein paar Blogposts, die auf Code verlinken.
https://developpeur-pascal.fr/faut-il-vraiment-utiliser-freeandnil-dont-nos-programmes-en-pascal.html https://corneliusconcepts.tech/delphi-debates-freeandnil
- F: Ich verstehe wirklich nicht den Grund für diese Debatte. Ich dachte, es wäre eine Erklärung dafür, warum FreeAndNil verwendet werden sollte, anstatt .Free und dann := nil zu verwenden. Hier scheinen wir die Verwendung von FreeAndNil für Objekte zu diskutieren, die ich nie erstellt habe. Ich glaube, ich habe den Faden verloren!
- A: Die Diskussion dreht sich um die Vor- und Nachteile der Verwendung von FreeAndNil und nicht zugewiesener Referenzen.
- F: Ich habe SafeMM3 entwickelt und einen Fehler in FireMonkey gefunden. Der Destruktor verwendete „Free“ für eine Referenz, die eigentlich verschwunden sein sollte, da es sich um einen Destruktor handelt, aber dann liefen einige SetFocus-Operationen mit baumelnden Zeigern herum. Sie können selten sicher sein, dass die letzte Referenzoperation wirklich die letzte ist.
- A: guter Punkt.
- Q:Der Punkt ist, dass NIL ein wirklich wahrer Wert im Code ist, und aus diesem Grund wird man nach diesen Situationen suchen (wie das Ablehnen einer NIL, wie Nick sagt), und als solche verschwindet NIL nicht, also ist es sinnvoll, etwas zu NIL Stellen Sie sicher, dass der Speicher tatsächlich NULL ist und nicht irgendein zufälliger alter Wert aus alten Tagen. Dies ist besonders wichtig, wenn Sie Low-Level-Hochleistungscode schreiben, aber offensichtlich viel weniger wichtig, wenn Sie hauptsächlich High-Level-Code schreiben und im Wesentlichen vorhandene Module zusammenschreiben. Schnittstellen haben absolut viele großartige Verwendungen, aber manchmal brauchen wir einfach Zeiger auf Datensätze oder Klassen, und da ist es sehr wichtig, den Überblick über NIL oder nicht NIL zu behalten. Daher hat FreeAndNil seinen Nutzen, aber auch x.Free; und x:=nil; Wenn letzteres fehlschlägt, kann FreeAndNil fehlschlagen und wir sprechen von einem Multithread-Szenario.
- A: Guter Punkt Kim.
- F: Falsch. Sie sollten eine Klasse nicht immer in ihrem Konstruktor erstellen. Es ist üblich, das Objekt bei seiner ersten Verwendung zu erstellen und es dann zur Wiederverwendung erstellt zu lassen.
- A: Ich sehe, dass es ziemlich viele Leute gibt, die beide Seiten dieses Standpunkts vertreten.
- F: Null-Objekt-Muster (das ist, was Nick Dummy-Objekt genannt hat) ist ok für injizierbare Objekte, aber nicht für viele kreierbare Objekte
- F: Kürzlich hatte ich einen schweren Absturz, weil ich auf ein freigegebenes Objekt zugegriffen habe, das nicht null war. Das ist wirklich schwer zu erkennen. Wenn die Variable den Gültigkeitsbereich verlässt, ist nil nicht wirklich erforderlich, aber Sie müssen den Code sehr sorgfältig prüfen, um ihn später nicht zu verwenden.
- A: Wenn die Möglichkeit besteht, dass Ihre Referenz später noch verwendet wird, sollten Sie sie meiner Meinung nach mit FreeAndNil auf nil zuweisen.
- F: Aktion := caFree Wenn ich das mache, muss ich einen Nullzeiger setzen? MyClass := TMyClass.Create; MyClass := nil wenn ich Action := caFree verwende
- F: Die Schlüsselfrage sollte wahrscheinlich lauten … gibt es einen echten NACHTEIL bei der Verwendung von freeandnil?
- A: Verschleiert Dinge und kann Fehler bei verzögerter Initialisierung verursachen.
- F: Bei der Verwendung von Interfaces geht es normalerweise nicht um Speicherverwaltung, das Mischen der beiden (mit dem Fehlen einer expliziten Dokumentation) ist eine ganze Reihe von Katastrophen, die darauf warten, passiert zu werden. Ich habe viele Codes gesehen, die Schnittstellenreferenzen zu Objekten enthielten, die freigegeben wurden, als die Referenzanzahl auf Null ging. Eine Speicherverwaltungsdisziplin, bei der FreeAndNil immer explizit freigegeben wird, scheint von Natur aus sicherer zu sein.
- A: vielleicht
- F: Ich denke, dass es bei einer Multithreading-Anwendung sinnvoll ist, Assigned() und FreeAndNil() zu verwenden, wenn Instanzen vorübergehend verwendet werden können oder Interaktionen mit entfernten Diensten/Servern unterbrochen werden können und Neuverbindungen mit diesen temporären Instanzen erforderlich sind.
- A: Ja, ich denke, einige der MVPs stimmen Ihnen zu.
- F: Ada.Unchecked_Deallocation funktioniert standardmäßig wie FreeAndNil. Dasselbe gilt für die Prozedur Delete, sie zerstört den übergebenen Cursor. Schade, dass Delphi-Entwickler sich selten von anderen Pascal-Nachkommen inspirieren lassen
- A: Ich denke, es gibt viel mehr Untersuchungen zu den Techniken und Innovationen aller Sprachen – nicht nur der Pascal-Nachkommen – die Sie vielleicht erkennen werden. Beispielsweise sind Inline-Variablendeklarationen (die ich persönlich gehasst habe, als sie herauskamen) von anderen Sprachen inspiriert, die dies taten. Sie sind sehr ‚un-pascal‘, aber es stellte sich heraus, dass sie einige sehr deutliche Vorteile hatten, die zu überzeugend waren, um sie zu ignorieren.
- F: Sie sollten nicht immer alle Objekte einer Klasse in ihrem Konstruktor erstellen. Es ist zumindest bei uns üblich, die Objekte nur dann zu erstellen, wenn sie benötigt werden, und sie dann zur Wiederverwendung erstellt zu lassen. Wenn die Klasse dann zerstört wird, sollte sie die erstellten Instanzen zerstören. Assigned und FreeAndNill sind dafür unerlässlich.
- A: Verzögerte Initialisierung, ja
- F: Muss fallen, aber tolle Diskussion!
- A: Danke Gary.
- F: Für die heutigen Computer sind die CPU-Zyklen für FreeAndNil unbedeutend, selbst für 3D-Engines oder was auch immer. Das ist nicht 1980!
- A: Wie Nick und Thomas betonten, muss der Entwickler überlegen, warum FreeAndNil, also braucht es mehr Entwicklerzyklen.
- Q:Ich lerne, wie man eine mobile Anwendung mit Delphi 10.4 CE FMX entwickelt, und ich habe viele Zweifel und kann sie nirgendwo finden, außer in Telegrammgruppen oder 99coders-Videos – die neben Márcio, Gledson Prego eine fantastische Didaktik haben , Anderson Fiori und MobiusOne, der uns sehr geholfen hat. Aber das reicht nicht für eine Anwendung, die so alt ist wie Delphi. Meine Zweifel sind: 1) Was ist die richtige Methode und wo zerstöre ich die Objekte (*), die in einer Funktion/Prozedur im VAR-Abschnitt instanziiert werden? (*)jsonarray, jsonobject, frame, etc… >> 1a) zerstören diese Objekte sie mit FreeAndNil, disposeOf, .free, =nil? >> 1b) Was ist die beste und effektivste Methode, um diese Objekte zu zerstören? >> 1c) Wo ist der richtige Ort (Ereignis), um sie zu zerstören? onClose, onZerstören? 2) Warum verursacht Delphi so viele Speicherlecks von Objekten, dass wir sicher sind, dass sie zerstört werden?
- F: Das ist eine großartige Sitzung (Marco)
- A: Ja, es scheint beliebt zu sein.
- F: Können Sie erläutern, warum FreeAndNil() nicht threadsicher ist?
- A: Es ist nicht atomar. Sie sollten die Referenz vor dem Aufruf von FreeAndNil sperren.
- F: „Dangling Pointers“ – ein kooperierendes Speicherverwaltungsmodell muss sicherstellen, dass Konsumenten von Objekten benachrichtigt werden, wenn ein Objekt freigegeben wird.
- F: FreeAndNil wird auf null gesetzt, bevor es freigegeben wird – während Sie also möglicherweise einen Kontextwechsel haben, bevor Sie das Objekt freigegeben haben, haben Sie den Zeiger bereits auf null gesetzt …
- F: Wenn Freigeben die letzte Aktion ist, dann Free(). Wenn eine Variable mehrfach verwendet wird, dann FreeAndNill()?
- A: Wenn Sie die Referenz wiederverwenden wollen, dann FreeAndNil
- F: Was macht FreeAndNil eigentlich? Warum setzt .Free die Referenz nicht auf null?
- A: Free überprüft die Referenz, um zu sehen, ob sie zugewiesen ist, und wenn ja, dann zerstört es das Objekt, verweist aber immer noch auf das zerstörte Objekt. FreeAndNil weist ihm zusätzlich die Referenz auf die Null zu.
- F: Leider funktionieren Inline-Variablen immer noch nicht. Wenn Sie die Referenzsuche oder Refactoring-Tools „nach“ einer Inline-Variable in einer Unit verwenden, werden diese Tools beschädigt 🙁
- A: Es gibt noch mehr Arbeit und RSPs im Zusammenhang mit Refactoring und Inline-Variablen. Das Refactoring (und ähnliches wie die automatische Neuformatierung) kann für neuere Sprachkonstrukte ein Problem darstellen.
- F: Der einzige spezifische Vorteil, den Pascal gegenüber C-basierten Sprachen hatte, war die Anforderung, Schnittstellenabschnitte UND Variablen vor der Verwendung zu deklarieren. Die Art und Weise, wie es möglich ist, sich tatsächlich einen Überblick über den Code zu verschaffen, indem man ihn auf einen Blick betrachtet.
- A: ja
- F: Finden Sie mein Projekt SafeMM3 auf OSDN. Im Gegensatz zu SafeMM und SafeMM2 ist es mit dem neuesten Delphi kompatibel, das auf Delphi 10.2 getestet wurde. Ich habe baumelnde Zeiger in FireMonkey gefunden, das von naked Free produziert wird
- A: Achten Sie auf baumelnde Zeiger.
- F: Und dann wurde dieser Vorteil durch Inline-Variablendeklaration und sogar Datentypableitung „kompromittiert“…. Brzzzz….
- A: Ich liebe Inline-Variablen.
- F: Wo sind die Beispiele?
- A: Ich habe oben einige Links gepostet.
- F: Ich erinnere mich, dass ich aus dem Clipper/Hafen komme, wo ich mit 14 Jahren angefangen habe und dort bis 2021 geblieben bin, wo ich aufgegeben und mir ein von 99coders verstärktes Video angesehen habe, in dem über Delphi gesprochen wurde, dessen Titel etwa so lautete: „Delphi ist tot?“ und es zeigte sich, dass man mit delphi viel machen kann, besonders für mobile (android/ios) lol
- F: Wie gehen Sie vor, wenn Sie DLLs verwenden und Objekte als Parameter übergeben? Erstellen Sie eine Kopie des Objekts und senden Sie es als Ergebnisobjekt zurück?
- A: Es kommt darauf an, nehme ich an.
- F: Hier noch eine Frage von jemandem aus Brasilien: 3) Warum haben Sie versucht, .DisposeOf zu verwenden, wenn Sie zu FreeAndNil() zurückkehren mussten?
- F: C++ – Ich habe einen C++-Hintergrund, weshalb ich das Fehlen einer expliziten Dokumentation zu Delphi-Schnittstellen so ärgerlich fand.
- A: äh, ja
- F: 4) Bitte geben Sie ein gutes Beispiel für die Verwendung von freeAndNill(), das effektiv kein Speicherleck hinterlässt…
- F: Diese Punkte bringen die Eigentums- / Leihideen in Rust zur Sprache
- A: Ja, Rust hat sich viel von Delphi inspirieren lassen.
- F: Ich habe keine Frage, aber ich möchte Ihnen für die Entwicklung von Delphi danken. Vielen Dank)
- A: Danke! Ich bin froh, dass Delphi auch hier ist!
- F: Was ist eine gute Quelle, um die Struktur des Schnittstellendesigns zu verstehen?
- A: Ich glaube, die Bücher von Nick Hodges gehen darauf ein
- F: Schnittstellen sind nicht Thread-sicher. Nur der Ref-Zähler innerhalb von TInterfacedObject ist. Die Schnittstellenzuweisung ist jedoch eine nicht atomare Operation und müsste gesperrt werden.
- A: Ja, Dalijas Buch diskutiert dies ausführlich.
- F: Es gab einen Kommentar über „Verschwendung von CPU-Zyklen“… Wie viele Assembler-Befehle sind für „x = nil“ erforderlich? Wenn dies für mehrere Objekte in einer Art Zyklus/Schleife durchgeführt wird, kann sich die Zuweisung von NIL auf die Leistung auswirken, wenn die Variablen nach der Freigabe nicht mehr referenziert werden, aber wenn die Variablen später möglicherweise außerhalb der Schleife referenziert werden, ist es besser zu wissen, ob dies der Fall ist wirklich auf ein vorhandenes Objekt verweisen.
- A: Überprüfen Sie die CPU-Ansicht und sehen Sie nach.
- F: Bei MISRA C dreht sich alles um Cargo-Cult-Programmierung. C erlaubt einzeilige Anweisungen, aber MISRA C verbietet sie. Es ist also eine ziemlich industrielle Praxis. Nichts wofür man sich schämen muss
- A: äh
- F: Schöne Debatte!
- A: Es hat sich als viel beliebter – und umstrittener – erwiesen, als wir dachten!
- F: @Nick, wenn Sie erwägen, FreeAndNil() niemals zu verwenden, wie können Sie dann in ereignisbasierten Anwendungen (nicht so selten) vermeiden, Objekte zu unbekannten Zeitpunkten zu erstellen, und vermeiden, sie zweimal oder öfter zu erstellen? Der typische Fall ist, wenn der Benutzer auf eine Schaltfläche klickt und einen TThread-Nachkommen ausführt. Was ist, wenn der Benutzer zweimal auf dieselbe Schaltfläche klickt, das 2. Mal, wenn der 1. TThread, der durch den 1. Klick gestartet wurde, nicht beendet ist.
- A: Vielleicht verhindern, dass die Schaltfläche zweimal angeklickt wird? Das scheint eine berechtigte Sorge zu sein.
- F: Ich habe es geschafft, ein Objekt mit „assigned“ zu instanziieren. Ich habe das Objekt nur mit „action: caFree“ aus dem Speicher befreit, aber ich habe nicht auf „nil“ gezeigt, wie ist das möglich?
- A: Wenn Sie FreeAndNil nicht aufrufen oder es explizit Nil zuweisen, nullt free die Referenz nicht.
- F: Beispiel, bei dem FreeAndNil Fehler im Code anzeigt: Mit object.Free erhalten Sie keine Ausnahme, wenn Sie das Objekt versehentlich verwenden. mit FreeAndNil(object) erhalten Sie die Ausnahme sofort! Beispiel: procedure TForm1.BT_Click(Sender: TObject); var sl: TStringList; begin sl:=TStringList.Create; versuchen Sie endlich sl.Free; //FreeAndNil(sl); Ende; // — // andere Sachen // — if (sl.Text = ”) then sl.Text:= ‚Hello World!‘; Ende;
- A: danke
- F: Gibt es eine Situation, in der ich ein freigegebenes Objekt verwenden muss? (öfter muss ich eine Variable „nullen“, ohne das Objekt freizugeben). Oder vielleicht existiert FreeAndNil nur der Vollständigkeit halber, weil x.free die var nicht „nullen“ konnte. Vielen Dank
- A: Meiner Meinung nach verwende ich FreeAndNil, wenn es andere Referenzen gibt, die darauf verweisen könnten, nachdem es nil ist.
- F: Kein Code ist fehlerfrei. Sie möchten, dass Bugs früh und hart scheitern. FreeAndNil hilft dabei, „use after free“-Bugs zu finden.
- A: wahr
- F: Ich rufe den Destruktor nie direkt auf, das ist die Aufgabe von Free, nicht wahr?
- A: ja
- F: Ich verwende fast immer freeandnil für Komponenten von Drittanbietern, vertraue niemals dem Code anderer Leute 😛
- F: Ich bin mir nicht sicher, ob der direkte Aufruf von Destroy tatsächlich schneller ist als die Verwendung von Free. Ganz einfach, weil Destroy ein virtueller Methodenaufruf ist. Jemand muss einen Benchmark liefern, um diesen Punkt zu beweisen
- A: wahr
- F: Das Erstellen eines Objekts bei seiner ersten Verwendung kann viele Probleme verursachen, wenn man versucht, etwas mit diesem Objekt zu tun. Ich habe dies erlebt, als ich einige Funktionen zum InplaceEditor eines TCustomGrid hinzugefügt habe.
- F: Das Ideal wäre, so zu programmieren, dass der Compiler dabei hilft, Probleme aufzugreifen … viele Diskussionen hier drehen sich stattdessen um Programmierfähigkeiten.
- F: Globale Formularreferenzen – die IDE erstellt automatisch einen globalen Zeiger auf Formulare …
- F: Nennen Sie die IDE also verrückt? In von Jim? Das ist einfach unhöflich!
- A: 🙂
- F: Apropos „Un-Pascal“-Inline-Variablen: Ada hat seit der Gründung einen Deklarations-Beginn-Ende-Block. Es ist also nicht „un-Pascal“, es ist nur, dass Sie Ada noch nicht kennen. Aber damit hört Ada nicht auf. Delphi hatte erst kürzlich „Inline-Variablen“ bekommen, während Entwickler in Ada häufiger tatsächlich „Inline-Konstanten“ genießen. Wenn etwas am Anfang eines Blocks initialisiert wird, besteht die Möglichkeit, dass es sich bis zum Ende des Gültigkeitsbereichs nie ändert. Das Markieren von „Konstanten“ erleichtert die Lesbarkeit und das logische Denken
- A: Ja!= Pascal. ️
- F: Wenn Sie FreeAndNIL dauerhaft verwenden, gibt es keinen zusätzlichen Entwicklerzyklus, wenn es verwendet wird. Es ist nur, wenn Sie in Ihrer Verwendung nicht konsequent sind …
- A: Ich nehme an, das ist ein gültiger Punkt.
- F: Darf ich sagen, wie sehr ich diese zum Nachdenken anregende Diskussion genossen habe? Vielen Dank!
- A: freut mich zu hören.
- F: Welche Bücher von Dalija Prasnikar würden Sie zum heutigen Thema empfehlen?
- A: https://dalija.prasnikar.info/delphimm/index.html
- F: Ich werfe meine zwei Pfennige in den Ring …. with statement… versuchen Sie, sie nicht zu verwenden und verwenden Sie sie auf keinen Fall für mehr als eine Sache ….. nur MHO
- A: Ja, das ist auch meine Meinung – aber anscheinend sind sich nicht alle einig – daher die Debatte.
- F: Welches soll dann verwendet werden, um zu zerstören: .free disposeOf =nil freeAndNil() ??? Welches gibt wirklich Speicher frei und wir werden den „Memory Leak“-Mist los? Beob.: Delphi 10.4 CE / FMX / Mobile
- F: Wie heißt Dalijas Buch?
- A: https://dalija.prasnikar.info/delphitspatt/
- F: Dieses Webinar war großartig. Ich bin ehrlich, ich habe nicht viel erwartet, aber ehrlich gesagt war dies eines der besseren Webinare der letzten Zeit…. Bitte mehr davon!!
- A: Zur Kenntnis genommen. Schön, dass es Ihnen gefallen hat.
- F: FreeAndNil nie verwendet. Niemals – es sei denn, Nick fängt an, es zu benutzen 😀
- A: äh
- F: Eine sehr interessante Diskussion über den Umgang mit Pointer-Variablen…. Normalerweise entsorge ich die Zeiger oder gebe sie nach der Verwendung an den Speicher zurück
- A: Ja. Das ist ein Muster.
- F: Stimmen Sie Holgers Vorschlag voll und ganz zu: Kann Delphi bitte aufhören, eine neue App mit einem Formular zu erstellen, das um Globals herum aufgebaut ist? Sicher eine Diskussion wert.
- A: Darüber habe ich auch nachgedacht.
- F: Der von Ihnen bereitgestellte Link funktioniert nicht: https://developpeur-pascal.fr/faut-il-vraiment-utiliser-freeandnil-don’t-nos-programmes-en-pascal.html – dieser Link funktioniert nicht ( 404-Fehler)
- F: Danke, ich habe die Sitzung genossen!
- F: Schlagen Sie vor, den Chat zu behalten und zu veröffentlichen
- F: Muss laufen. Vielen Dank!!! Gut gemacht.
- F: Zerstören allein ist schneller als Frei. Die Implementierung von Free ist „IF Assigned(Self) THEN Destroy;“ Wenn Sie also Destroy direkt anrufen, lassen Sie einen CALL und eine „If Assigned“-Prüfung aus – Sie rufen immer noch den virtuellen Destroy an …
- F: Wenn Sie die Thread-Sicherheit von Schnittstellen-Sachen überprüfen möchten, schreiben Sie den TInterfacedObject-Nachkommen, der Sleep(10) in AddRef und Release aufruft. Ich habe lock-freie Referenzen mit der Compare-And-Exchange-Primitieve geschrieben, die diesen Test besteht. Ich kann wahrscheinlich auch Thread-sichere schwache Referenzen erstellen
- F: Ehrlich gesagt, die edlen „Gurus“ haben keine meiner Fragen beantwortet. Es gibt 11 Männer und Frauen, die die Schädel von Pascal / Delphi sind und ich starte und komme vom Klipper / Hafen, ich möchte Ihre Aufmerksamkeit, auch damit ich mich wie zu Hause fühle!
- F: Ich versuche immer, wenn möglich, das Objekt zu erstellen und das gleiche Objekt innerhalb der gleichen Routine zu befreien, auf diese Weise habe ich viel mehr Kontrolle und weitaus weniger Chancen auf Speicher- und Referenzprobleme und r
- F: Wir reden viel über die jahrelange Nutzung von Schnittstellen zur automatischen Speicherverwaltung … was ist jetzt mit Managed Records? Können wir RAII in Delphi machen … gibt es einen anderen Weg?
- A: Ja, RAII führt das ein.
- F: Es wäre ausgezeichnet, wenn Sie die gestellten Fragen und Antworten zusammenstellen und veröffentlichen würden.
- A: Werde mich darum kümmern.
- F: Ich bin etwas spät dazugekommen, tut mir leid, falls das schon einmal gefragt wurde; wenn Sie das untergeordnete Objekt wie in (ParentObject.childObject) trotzdem freigeben und dann freeAndNil parentObject … kann dies nicht sicher sein, da die Zeit, die benötigt wird, um jedes Objekt zu befreien, sich überschneiden kann und sequentiell ist?
- A: Gute Frage. Selbst wenn Sie die Referenz auf Null setzen, ist das Objekt immer noch dafür verantwortlich, seine Kinder freizugeben, während die Kinder ein Benachrichtigungsmuster verwenden, um die Eltern zu benachrichtigen, wenn sie freigegeben werden.
- F: Wenn Sie einen Thread durch Klicken auf eine Schaltfläche starten, sollten Sie offenbar darauf vorbereitet sein, mehrere Threads auszuführen :-), Sie werden keine gemeinsam genutzten Objekte in einem solchen Thread freigeben. Oder … Sie deaktivieren die Schaltfläche.
- A: ja
- F: Wie viel teurer ist FreeAndNil gegenüber manuellem Free, gefolgt von manueller Zuweisung von Free?
- A: CPU-technisch erfordert es nicht viel, aber was kommuniziert es.
- F: Ich habe diese lebhafte Diskussion wirklicher Programmierexperten genossen
- F: Delphi RTL verwendet GOTO 🙂
- A: ja
- F: Danke, bitte mehr darüber. +1
- A: sicher
- F: Wenn Sie ein TJSONObject zerstören, werden dann auch alle „GetValue as TJSONString“-Objekte zerstört?
- F: Vorschlag … können wir nicht einfach „nicht verwenden mit“ haben … lassen Sie uns das haben, was es zu tun versucht hat … was andere Sprachen haben … und was wir stattdessen mit modernem Delphi in dieser Richtung anfangen könnten
- F: Werden Schaltflächen-Klick-Ereignisse nicht als Ergebnis von GetMessage aus der UI-Thread-Warteschlange geliefert? Das zweite Click-Ereignis wird nicht geliefert, bis das erste verarbeitet wurde, es sei denn, es wird programmgesteuert erzeugt, was ein Wiedereintrittsproblem wäre. Was fehlt mir hier?
- F: Mehr goto in RTL, seit ich angefangen habe, einige Systemfunktionen zu optimieren, ohne asm zu machen 😉
- F: Es ist nicht so einfach, die Schaltfläche einfach zu deaktivieren, da die Dinge komplizierter sind. Ich verwende so etwas wie „Nachfrage“ aus der funktionalen Programmierung. Wenn also zum ersten Mal auf die Schaltfläche geklickt wird, wird die referenzgezählte Nachfrage erstellt, die dem „ersten Klick“ gewidmet ist. Der Thread kann dann einige Dinge tun und seine eigene „Anforderung“ abfragen, um zu überprüfen, ob sie noch angefordert wird. Und nachdem Sie Synchronize eingegeben haben, prüfen Sie auch, ob diese spezielle „Anforderung“ noch vorhanden ist. Beim zweiten Klicken auf die Schaltfläche wird der alte Bedarf als veraltet markiert und der neue Bedarf bereitgestellt. So bekommt der erste Thread die Botschaft: Geh weg, wir brauchen dich nicht mehr
- F: Wunsch: Lokale, statische Variablen, die Aufrufe überdauern (verwenden derzeit zuweisbare, lokale CONSTs)
- F: Danke
Design. Code. Compile. Deploy.
Start Free Trial Upgrade Today
Free Delphi Community Edition Free C++Builder Community Edition