AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Wo bleibt die Exception?

Ein Thema von DerAndereMicha · begonnen am 11. Aug 2015 · letzter Beitrag vom 11. Aug 2015
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von DerAndereMicha
DerAndereMicha

Registriert seit: 1. Jul 2004
Ort: Berlin
208 Beiträge
 
Delphi 2007 Enterprise
 
#1

Wo bleibt die Exception?

  Alt 11. Aug 2015, 10:15
Delphi-Version: 2007
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
Der Weg ist das Ziel...
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.771 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Wo bleibt die Exception?

  Alt 11. Aug 2015, 10:20
..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
Klaus
  Mit Zitat antworten Zitat
OlafSt

Registriert seit: 2. Mär 2007
Ort: Hamburg
284 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

AW: Wo bleibt die Exception?

  Alt 11. Aug 2015, 10:25
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.
  Mit Zitat antworten Zitat
Benutzerbild von DerAndereMicha
DerAndereMicha

Registriert seit: 1. Jul 2004
Ort: Berlin
208 Beiträge
 
Delphi 2007 Enterprise
 
#4

AW: Wo bleibt die Exception?

  Alt 11. Aug 2015, 10:26
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
Der Weg ist das Ziel...
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.800 Beiträge
 
Delphi 12 Athens
 
#5

AW: Wo bleibt die Exception?

  Alt 11. Aug 2015, 10:27
...aber FreeAndNil ist böse. Sagt zumindest der Onkel Nick.

Sherlock
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
OlafSt

Registriert seit: 2. Mär 2007
Ort: Hamburg
284 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

AW: Wo bleibt die Exception?

  Alt 11. Aug 2015, 12:01
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.
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#7

AW: Wo bleibt die Exception?

  Alt 11. Aug 2015, 12:18
Das habe ja auch schon festgestellt - aber ist dieses Verhalten denn normal?
Ist es. As designed.

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.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.176 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

AW: Wo bleibt die Exception?

  Alt 11. Aug 2015, 12:43
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.
  Mit Zitat antworten Zitat
Benutzerbild von DerAndereMicha
DerAndereMicha

Registriert seit: 1. Jul 2004
Ort: Berlin
208 Beiträge
 
Delphi 2007 Enterprise
 
#9

AW: Wo bleibt die Exception?

  Alt 11. Aug 2015, 12:48
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
Der Weg ist das Ziel...
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#10

AW: Wo bleibt die Exception?

  Alt 11. Aug 2015, 12:57
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
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (11. Aug 2015 um 12:59 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:59 Uhr.
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