AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Schutzverletzung beim Freigeben einer TStringList
Thema durchsuchen
Ansicht
Themen-Optionen

Schutzverletzung beim Freigeben einer TStringList

Ein Thema von Garfield · begonnen am 15. Okt 2005 · letzter Beitrag vom 16. Okt 2005
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Garfield
Garfield

Registriert seit: 9. Jul 2004
Ort: Aken (Anhalt-Bitterfeld)
1.335 Beiträge
 
Delphi XE5 Professional
 
#1

Schutzverletzung beim Freigeben einer TStringList

  Alt 15. Okt 2005, 17:37
Mit lkVCDxRip.exe wird eine SVCD gerippt/ein SVCD-Image extrahiert. Anschließend werden mit folgendem Quelltext aus der XML die Kapitelzeiten ausgelesen und in einer Textdatei gespeichert.

Delphi-Quellcode:
  sl := TStringList.Create; // Stringlist für das XML
  kl := TStringList.Create; // Stringlist für die Kapitelzeiten

  sl.LoadFromFile(xml); // Laden der XML

  for i := 0 to sl.Count - 1 do // Suchen der Tags mit den Kapitelzeiten
  if pos ('entry id=', sl.Strings[i]) > 0
  then begin
    von := pos ('>', sl.Strings[i]); // Ende des Anfang-Tags
    bis := pos ('</', sl.Strings[i]); // Anfang des Ende-Tags
    if bis > von
    then begin
      kap := copy(sl.Strings[i], von + 1, bis - von - 4); // Zeit in Kapitelliste kopieren
      kl.Add (kap);
    end;
  end;

  sl := NIL; // Stringlist des XML freigeben
  sl.Free;

  if kl.Count > 0 // Punkt gegen Komma austaschen und den Wert Null entfernen
  then begin
    i := 0;
    while i < kl.Count
    do begin
      kap := Tausch(kl.Strings[i], '.', ',' ,false, true);
      kl.Strings[i] := kap;
      if StrToFloat(kap) = 0
      then kl.Delete(i)
      else inc(i);
    end;
  end;

  if kl.Count > 0 // Zeitformat ändern
  then begin
    for i := 0 to kl.Count - 1
    do begin
      kap := kl.Strings[i];
      kl.Strings[i] := FormatSecS(kap); // Funktion in einer anderen Unit
    end;
  end;

  if kl.Count > 0 // Die Kapitelliste speichern
  then begin
    kap := (ChangeFileExt(Ziel, '.Kapitel')); // Ziel ist die *.mpg von der SVCD
    kl.SaveToFile(kap);
  end;

  while not FileExists(kap)
  do sleep(50)

  kl := NIL; // Kapitelliste freigeben
  kl.Free;
Beim Freigeben der Kapitelliste (kl.free) gibt es eine Schutzverletzung. Durch die Abfrage, ob die Kapiteldatei angelegt wurde, hat sich die Wahrscheinlichkeit, dass die Schutzverletzung auftritt, verringert. Wenn ich noch ein 'Sleep(1000);' verwende, tritt bei mir die Schutzverletzung nicht mehr auf. Allerdings bei anderen Anwendern.

Kann mir jemand erklären, warum an dieser Stelle eine Schutzverletzung auftritt und ob es eine bessere Lösung als ein Sleep gibt?
Gruss Garfield
Ubuntu 22.04: Laz2.2.2/FPC3.2.2 - VirtBox6.1+W10: D7PE, DXE5Prof
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#2

Re: Schutzverletzung beim Freigeben einer TStringList

  Alt 15. Okt 2005, 17:40
Die Zeilen
Delphi-Quellcode:
kl := Nil;
kl.Free;
Sind falschrum, dreh Sie um und es wird ein Schuh draus, oder verwende gleich
FreeandNil (kl);
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von ManuMF
ManuMF

Registriert seit: 11. Jul 2005
1.016 Beiträge
 
Delphi 6 Personal
 
#3

Re: Schutzverletzung beim Freigeben einer TStringList

  Alt 15. Okt 2005, 18:11
und

Delphi-Quellcode:
sl := TStringList.Create;
try
  sl.LoadFromFile(...);
  ...
  ...
finally
  FreeAndNil(sl);
end;
Natürlich mit beiden.

Gruß,
ManuMF
Gruß,
ManuMF

Endlich hab ich was Positives an Vista entdeckt: Das mitgelieferte Mahjongg
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#4

Re: Schutzverletzung beim Freigeben einer TStringList

  Alt 15. Okt 2005, 18:52
Hupsa, selbstverständlich, ManuMF
[edit] [/edit]
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von Garfield
Garfield

Registriert seit: 9. Jul 2004
Ort: Aken (Anhalt-Bitterfeld)
1.335 Beiträge
 
Delphi XE5 Professional
 
#5

Re: Schutzverletzung beim Freigeben einer TStringList

  Alt 15. Okt 2005, 18:56
Ich danke Euch.

Ist schon eigenartig. In meinem Programm stehen die beiden Befehle noch einige Male in dieser falschen Reihenfolge, aber nur an der einen Stelle kommt es zu einem Fehler.
Gruss Garfield
Ubuntu 22.04: Laz2.2.2/FPC3.2.2 - VirtBox6.1+W10: D7PE, DXE5Prof
  Mit Zitat antworten Zitat
tigerman33

Registriert seit: 30. Jul 2005
Ort: München
423 Beiträge
 
Delphi 2005 Professional
 
#6

Re: Schutzverletzung beim Freigeben einer TStringList

  Alt 15. Okt 2005, 19:18
Dann werden die anderen Zeilen durch if-Abfragen o.ä. vor dem Ausführen "geschützt". Sonst knallt das nämlich 100%ig. => alle unbedingt ändern.
Christian
Der Computer hilft mir, Probleme zu lösen, die ich ohne Computer nicht hätte.
  Mit Zitat antworten Zitat
Benutzerbild von Garfield
Garfield

Registriert seit: 9. Jul 2004
Ort: Aken (Anhalt-Bitterfeld)
1.335 Beiträge
 
Delphi XE5 Professional
 
#7

Re: Schutzverletzung beim Freigeben einer TStringList

  Alt 15. Okt 2005, 19:34
Einige werden maximal einmal und andere fast immer aufgerufen. So wie bei sl. Und es gab bisher keine Fehler. Habe es jetzt alles in FreeAndNil geändert. Schließlich ist Vorsicht die Mutter der Prozellankiste.
Gruss Garfield
Ubuntu 22.04: Laz2.2.2/FPC3.2.2 - VirtBox6.1+W10: D7PE, DXE5Prof
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#8

Re: Schutzverletzung beim Freigeben einer TStringList

  Alt 15. Okt 2005, 21:03
Free ist eine Class Procedure, die erst prüft, ob die Referenz <> nil ist, und erst dann ggf. den destructor aufruft. Also, eigentlich dürfte auch hier nichts passieren:
Delphi-Quellcode:
Var
  sl : TStringlist;

Begin
  sl := nil;
  sl.Free;
End;
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).
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von GuenterS
GuenterS

Registriert seit: 3. Mai 2004
Ort: Österreich > Bad Vöslau
760 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: Schutzverletzung beim Freigeben einer TStringList

  Alt 15. Okt 2005, 21:53
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.

Delphi-Quellcode:
procedure TueWas(xml, Ziel: string);
var
  sl, kl: TStringList;
  kap: string;
  i, von, bis: integer;
begin
  kl := TStringList.Create; // Stringlist für die Kapitelzeiten
  try
    sl := TStringList.Create; // Stringlist für das XML
    try
      sl.LoadFromFile(xml); // Laden der XML

      for i := 0 to sl.Count - 1 do // Suchen der Tags mit den Kapitelzeiten
        if pos('entry id=', sl.Strings[i]) > 0 then
        begin
          von := pos('>', sl.Strings[i]); // Ende des Anfang-Tags
          bis := pos('</', sl.Strings[i]); // Anfang des Ende-Tags
          if bis > von then
          begin
            kap := copy(sl.Strings[i], von + 1, bis - von - 4);
            kap := StringReplace(kap, '.', ',', rfReplaceAll);
            if StrToFloat(kap) <> 0 then
              kl.Add(FormatSecS(kap)); // Zeit in Kapitelliste kopieren
          end;
        end;
    finally
      sl.Free; //StringList des XML freigeben
    end;

    if kl.Count > 0 then {// Die Kapitelliste speichern }
    begin
      kap := (ChangeFileExt(Ziel, '.Kapitel'));
        // Ziel ist die *.mpg von der SVCD
      kl.SaveToFile(kap);
    end;

  finally
    kl.Free;
  end;
end;
Günter
Pünktlichkeit ist die Fähigkeit vorherzusagen um wieviel sich der Andere verspäten wird.
  Mit Zitat antworten Zitat
tigerman33

Registriert seit: 30. Jul 2005
Ort: München
423 Beiträge
 
Delphi 2005 Professional
 
#10

Re: Schutzverletzung beim Freigeben einer TStringList

  Alt 16. Okt 2005, 11:16
@Alzaimar:
Free ist dazu da, den von der Instanz alloziierten Speicher wieder freizugeben. Wenn man vorher den Objektzeiger auf nil setzt, ist ein Aufruf von Free im besten Fall unsinnig und der Speicher ist halt verloren, oder es knallt.
Christian
Der Computer hilft mir, Probleme zu lösen, die ich ohne Computer nicht hätte.
  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 14:44 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