Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Schutzverletzung beim Freigeben einer TStringList (https://www.delphipraxis.net/55043-schutzverletzung-beim-freigeben-einer-tstringlist.html)

alzaimar 16. Okt 2005 11:22

Re: Schutzverletzung beim Freigeben einer TStringList
 
Nein.

Free ist eine Procedure (keine Class Procedure, sorry) von TObject, und die ist so definiert:
Delphi-Quellcode:
procedure TObject.Free;
begin
  if Self <> nil then
    Destroy;
end;
Insofern stimmt Deine Aussage natürlich teilweise, weil Free eben den Speicher freigibt. Aber, wenn ich vorher die Objektreferenz auf Nil setze, passiert einfach N-I-X. Der Speicher wird nicht freigegeben, aber es knallt nicht, wie man am Code unschwer erkennen kann.

tigerman33 16. Okt 2005 11:33

Re: Schutzverletzung beim Freigeben einer TStringList
 
Gut, einigen wir uns in der Mitte:
Es knallt vielleicht nicht, aber die Speicherleiche hat man halt trotzdem. :wink:

Wobei ich mich frage, wie er die Procedure im Speicher wiederfindet, wenn ich den Zeiger "genilt" habe und es keine class-Procedure ist. :gruebel:

Garfield 16. Okt 2005 11:37

Re: Schutzverletzung beim Freigeben einer TStringList
 
Zitat:

Zitat von alzaimar
Wenn aber doch, dann tippe ich, ehrlich gesagt, auf einen dieser fiesen Seiteneffekte, der sich dann einstellt, wenn irgendwo im Code was zerschossen wurde (Durch Überschreiben eines freigegebenen Speicherbereiches etwa).

Hier wird mit lkVCDxRip.exe die SVCD in einen temporären Ordner kopiert und die XML erstellt. Anschließend wird die MPG verschoben und umbenannt, die Kapitelzeiten aus der XML ausgelesen, die Kapiteldatei gespeichert und dann kommt bei manchen Systemen eine Zugriffsverletzung bevor der temporäre Ordner wieder gelöscht wird. Vor allen anderen NIL und Free-Befehlen wird maximal eine kleine Graphik- oder Batchdatei gespeichert.

Zitat:

Zitat von GuenterS
Hallo, mir ist aufgefallen, dass Du die kl StringListe öfter als notwendig durchgehst (bzw. brauchst Du sie gar nicht durchgehen), habe deine procedure dahingehend überarbeitet, dass dies nicht passiert und auch schon die try ... finallys eingebaut.

Danke, die zwei Schleifen waren mir noch gar nicht bewußt geworden. Das werde ich nachher gleich einbauen.

Zitat:

Zitat von tigerman33
... oder es knallt.

In dem Fall gab es eine "Zugriffsverletzung bei Adresse 004c835f im modul "*.exe" lesen von Adresse 000000."

Zitat:

Zitat von tigerman33
Wobei ich mich frage, wie er die Procedure im Speicher wiederfindet, wenn ich den Zeiger "genilt" habe und es keine class-Procedure ist. :gruebel:

Vermutlich wird sie nicht gefunden und deshalb kommt es zu der Zugriffsverletzung?

tigerman33 16. Okt 2005 11:44

Re: Schutzverletzung beim Freigeben einer TStringList
 
Das war meine Vermutung. Aber alzaimar sagt ja, dass einfach nichts passiert, also auch keine AV. Damit keine AV kommt, muss er ja den Prozedurcode zumindest im Speicher wiederfinden. Und da frag ich mich halt, wie das funktionieren soll.

xaromz 16. Okt 2005 11:49

Re: Schutzverletzung beim Freigeben einer TStringList
 
Hallo,
Zitat:

Zitat von Garfield
Zitat:

Zitat von tigerman33
Wobei ich mich frage, wie er die Procedure im Speicher wiederfindet, wenn ich den Zeiger "genilt" habe und es keine class-Procedure ist. :gruebel:

Vermutlich wird sie nicht gefunden und deshalb kommt es zu der Zugriffsverletzung?

Nein, da Free eine Methode der untersten Basisklasse ist (TObject), weiss der Compiler immer, wohin er springen muss, nämlich nach TObject.Free. Ansonsten würde ja die Überprüfung auf nil in Free keinen Sinn ergeben. Im CPU-Fenster steht deshalb einfach "call TObject.Free".

Gruß
xaromz


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:34 Uhr.
Seite 2 von 2     12   

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 by Thomas Breitkreuz