AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Zugriffsverletzung bei TObjectlist.delete
Thema durchsuchen
Ansicht
Themen-Optionen

Zugriffsverletzung bei TObjectlist.delete

Ein Thema von ozz · begonnen am 19. Mär 2007 · letzter Beitrag vom 23. Mär 2007
Antwort Antwort
Seite 4 von 4   « Erste     234   
IngoD7

Registriert seit: 17. Feb 2004
464 Beiträge
 
Delphi 7 Enterprise
 
#31

Re: Zugriffsverletzung bei TObjectlist.delete

  Alt 21. Mär 2007, 19:53
Zitat von ozz:
Hallo IngoD7,
herzlichen Dank für den Hinweis. Ich habe dich verstanden und auch dein Anliegen. Ich habe die Test genau so gemacht, wie du es vorgeschlagen hast. Ich habe auch das Free eingebaut und das Delete entfernt. Danke nochmal!
Test?

Postest du bitte mal deinen aktuellen Destruktor TStreamlist.destroy?
  Mit Zitat antworten Zitat
ozz

Registriert seit: 26. Jun 2005
131 Beiträge
 
#32

Re: Zugriffsverletzung bei TObjectlist.delete

  Alt 22. Mär 2007, 18:24
Hallo IngoD7,
ich habe mich in letzter Instanz entschieden, den Tip von Jelly angenommen. Daher habe ich jetzt keinen eigenen Destructor mehr, sondern den der Klasse TObjectlist. Den Test, nach dem du gefragt hast, habe ich vor diese letzten Änderung gemacht. Momentan sieht die Klasse so aus.


Delphi-Quellcode:
type TStreamlist= class (TObjectlist)
private
   function GetStream(Index: Integer): TStringstream;
   procedure PutStream(Index: Integer; const Value: TStringstream);

public
   function add: integer;overload;
   function Add(Item:TStringstream):integer;overload;
   property items[Index: Integer]: TStringstream read GetStream write PutStream;
end;

implementation

function TStreamlist.add: integer;
var TagType: TStringstream;
begin
   TagType:=TStringstream.Create('');
   Result:= inherited add(TagType);
end;

function TStreamlist.Add(Item: TStringstream): Integer;
begin
    Result:= inherited add(item);
end;

function TStreamlist.GetStream(Index: Integer):TStringstream;
begin;
    result:= TStringstream(inherited Items[Index]);
end;

procedure TStreamlist.PutStream(Index: Integer; const Value: TStringstream);
begin
    inherited items[Index]:=Value;
end;

end.
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#33

Re: Zugriffsverletzung bei TObjectlist.delete

  Alt 22. Mär 2007, 19:12
Zitat von ozz:
Delphi-Quellcode:
function TStreamlist.add: integer;
var TagType: TStringstream;
begin
   TagType:=TStringstream.Create('');
   Result:= inherited add(TagType);
end;
Das geht sogar noch kürzer
Delphi-Quellcode:
function TStreamlist.add: integer;
begin
   Result:= inherited add(TStringstream.Create(''));
end;
  Mit Zitat antworten Zitat
Achim Kalwa

Registriert seit: 2. Apr 2005
Ort: Lienen
110 Beiträge
 
Delphi 12 Athens
 
#34

Re: Zugriffsverletzung bei TObjectlist.delete

  Alt 22. Mär 2007, 19:39
Hallo,

ich hab' jetzt nicht alle Antworten gelesen und weiß auch nicht, was dieses Konstrukt genau anstellen soll. Aber das hier springt mir doch ins Auge:
Zitat von ozz:
Delphi-Quellcode:
procedure TStreamlist.clear;
begin
 while FStreamObjectList.Count >0 do
 begin
   FStreamObjectList.Delete(0);
 end;
end;
Warum machst Du nicht einfach folgendes:
Delphi-Quellcode:
procedure TStreamlist.clear;
begin
  FStreamObjectList.Clear;
end;
Das löscht ebenfalls alle Objekte in FStreamObjectList. Und da FStreamObjectList der Eigentümer aller enthaltener Objekte ist, werden diese alle auch vorher brav mit Free freigegeben.

Wenn Du das -- aus irgend einem Grund -- trotzdem "von Hand" machen möchtest, dann musst Du nach dem Free() den Eintrag in der Liste auf NIL setzen. Der nachfolgende Aufruf von Clear() durchläuft ja intern noch einmal die Liste und versucht, die Items freizugeben... *Bumm*. Dass die Items von Dir schon freigeben wurden, kann die Liste ja nicht wissen.

Delphi-Quellcode:
destructor TStreamlist.destroy;
var i:Integer;
begin;
  for i:= FStreamObjectList.Count-1 downto 0 do // Rückwärts laufen
  begin
    FStreamObjectList.Items[i].free // jedes einzelne Objekt expl. freigeben
    FStreamObjectList.Items[i] := nil; // Referenz entfernen!!!
  end;
  FStreamObjectList.Clear(); // Alle Items entfernen.
  inherited Destroy; // und zum Schluss noch das Basisdestroy
Aber wie schon geschrieben: Der ganze Code ist hyperfluid: TObjectList.Clear() macht das alles schon intern!

Achim
Achim
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#35

Re: Zugriffsverletzung bei TObjectlist.delete

  Alt 22. Mär 2007, 19:54
Zitat von kalwados:
ich hab' jetzt nicht alle Antworten gelesen und weiß auch nicht, was dieses Konstrukt genau anstellen soll.
...
Warum machst Du nicht einfach folgendes:
Delphi-Quellcode:
procedure TStreamlist.clear;
begin
  FStreamObjectList.Clear;
end;
Tja, hättest Du vielleicht machen können. Das hätt Dir einiges an Tipparbeit erspart
  Mit Zitat antworten Zitat
IngoD7

Registriert seit: 17. Feb 2004
464 Beiträge
 
Delphi 7 Enterprise
 
#36

Re: Zugriffsverletzung bei TObjectlist.delete

  Alt 23. Mär 2007, 08:31
Zitat von ozz:
Hallo IngoD7,
ich habe mich in letzter Instanz entschieden, den Tip von Jelly angenommen. Daher habe ich jetzt keinen eigenen Destructor mehr,
... sondern du leitest jetzt wieder direkt von TComponentList ab und hast vor allen Dingen kein extra Feld FStreamObjectList mehr.
Das ist neu. Das hättest du zwischendurch mal schreiben können.
Dann hätte ich mir auch Tipparbeit sparen können.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 4 von 4   « Erste     234   


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 19:40 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