![]() |
Delphi-Version: 2007
Wo bleibt die Exception?
Hallo Zusammen,
ich habe gerade ein seltsames Verhalten entdeckt, was ich mir nicht erklären kann. Warum kommt bei folgendem Konstrukt keine Exception?
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject); var IDs:TStringList; begin IDs:=TStringList.Create; Try IDs.Add('1'); IDs.Add('2'); Finally IDs.Free; End; IDs.Add('3'); MessageDlg(IDs[0], mtInformation, [mbOK], 0); end; Ich greife hier doch auf ein Objekt zu, welches vorher gefreet wurde. Erst wenn ich es auch noch nil setze, bekomme ich eine Zugriffsverletzung. Gruß Micha |
AW: Wo bleibt die Exception?
..meine halbgare Erklärung.
Der Speicher wurde freigegeben aber nicht überschrieben. Wenn Du ihn mit freeAndNil(IDs) freigibts wird der Speicher aich genullt. Grüße Klaus |
AW: Wo bleibt die Exception?
Fast richtig.
Der Speicherbereich wird nur als "frei" markiert. Der Zeiger auf diesen Speicherblock, auf den IDs zeigt, bleibt aber intakt, ebenso wie der Inhalt des Zeigers selbst. Dadurch kann man das ganze Konstrukt noch eine Weile weiterbenutzen - es ist nur fraglich, ob das immer klappt und wie lange das gut geht. However. Erst ein FreeAndNil setzt den Block auf "frei" und den Zeiger auf nil. |
AW: Wo bleibt die Exception?
Das habe ja auch schon festgestellt - aber ist dieses Verhalten denn normal?
Ich programmiere nun schon über 10 Jahre mit Delphi, meines Erachtens hat es in so einem Fall aber früher auch immer ohne nil-Setzen ne Exception gegeben. Allerdings finde ich das ganze insofern etwas seltsam, daß sich an meiner Delphi-Version schon seit mehreren Jahren nichts geändert hat - nur die Betriebssysteme wurden halt immer neuer. Gruß Micha |
AW: Wo bleibt die Exception?
|
AW: Wo bleibt die Exception?
Zitat:
Bei lokalen Variablen dieser Art spielt das kaum eine Rolle, bei globalen Variablen würde ich aber immer mit FreeAndNil arbeiten - oder zumindest selbst die Variable auf NIL setzen. |
AW: Wo bleibt die Exception?
Zitat:
Zitat:
Es kann gut sein, daß du beim Zugriff auf ein freigegebenes Objekt eine Exception erhältst, wenn du das Programm in der IDE laufen läßt, in der Release-Version dagegen keine Exception auftritt. Ich habe noch niemals erlebt, daß der Zugriff auf eine freigegebene Stringliste keine Exception erzeugt – aber zugegeben, allzu oft hab ich das noch nicht ausprobiert, da ich gewöhnlich keinen Nonsens-Code produziere. |
AW: Wo bleibt die Exception?
Tu dir einen Gefallen und benutze, zumindest für das Testen und Debuggen,
![]() Zitat:
|
AW: Wo bleibt die Exception?
Zitat:
Zitat:
Ich nutze immer FastMM. Eine Meldung kommt trotzdem nicht. Gruß Micha |
AW: Wo bleibt die Exception?
ich sag mal einfach
![]() Erst das Wasser aus dem Becken lassen und dann wundern dass der Sprung in das selbige Becken aua macht und keiner vorher geschrien hat. Warum auch? Es wurde doch bewusst gemacht ... vielleicht ist das ja eine neue Sportart :mrgreen: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:15 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