Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Wo bleibt die Exception? (https://www.delphipraxis.net/186182-wo-bleibt-die-exception.html)

DerAndereMicha 11. Aug 2015 09:15

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

Klaus01 11. Aug 2015 09:20

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

OlafSt 11. Aug 2015 09:25

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.

DerAndereMicha 11. Aug 2015 09:26

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

Sherlock 11. Aug 2015 09:27

AW: Wo bleibt die Exception?
 
...aber FreeAndNil ist böse. Sagt zumindest der Onkel Nick.

Sherlock

OlafSt 11. Aug 2015 11:01

AW: Wo bleibt die Exception?
 
Zitat:

Zitat von DerAndereMicha (Beitrag 1311762)
Das habe ja auch schon festgestellt - aber ist dieses Verhalten denn normal?

Auf sicher. Ich erinnere mich an ein Delphi-7-Programm, das mit globalen Variablen arbeitete und einen völlig unmöglichen Fehler produzierte... Drei Tage habe ich gebuddelt, dann fand ich heraus, das eine gobal angelegte TStringList mit Free freigegeben wurde, deren Variable aber nicht auf NIL. Irgendwann belegte der Memorymanager den Bereich neu und das Programm crashte.

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.

Perlsau 11. Aug 2015 11:18

AW: Wo bleibt die Exception?
 
Zitat:

Zitat von DerAndereMicha (Beitrag 1311762)
Das habe ja auch schon festgestellt - aber ist dieses Verhalten denn normal?

Ist es. As designed.

Zitat:

Zitat von DerAndereMicha (Beitrag 1311762)
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.

Es ist purer Zufall, wenn du keine Exception erhältst, während du auf ein freigegebenes Objekt zugreifst. Freigegebener Speicher kann, muß aber nicht zwangsläufig sofort nach der Freigab wieder verwendet werden. Was die Delphi-IDE hinsichtlich Memory genau treibt, entzieht sich meiner Kenntnis. Mit anderen Worten:

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.

Der schöne Günther 11. Aug 2015 11:43

AW: Wo bleibt die Exception?
 
Tu dir einen Gefallen und benutze, zumindest für das Testen und Debuggen, benutze FastMM. Dann bekommst du in deinem Fall auch, zur Laufzeit, ein

Zitat:

---------------------------
Project3.exe: Memory Error Detected
---------------------------
FastMM has detected an attempt to call a virtual method on a freed object. An access violation will now be raised in order to abort the current operation.



Freed object class: TStringList

um die Ohren.

DerAndereMicha 11. Aug 2015 11:48

AW: Wo bleibt die Exception?
 
Zitat:

allzu oft hab ich das noch nicht ausprobiert, da ich gewöhnlich keinen Nonsens-Code produziere.
Ich eigentlich auch nicht. Habe ein ähnliches Konstrukt durch Zufall in einem Quelltext gefunden und mich nur gewundert, warum es keine Zugriffsverletzung gibt.

Zitat:

Tu dir einen Gefallen und benutze, zumindest für das Testen und Debuggen, benutze FastMM.

Ich nutze immer FastMM. Eine Meldung kommt trotzdem nicht.

Gruß
Micha

Sir Rufo 11. Aug 2015 11:57

AW: Wo bleibt die Exception?
 
ich sag mal einfach Bei Google suchendangling pointer, weil damit ist dann alles gesagt.

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 02:26 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz