AGB  ·  Datenschutz  ·  Impressum  







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

AV - Warum?

Ein Thema von glkgereon · begonnen am 24. Sep 2005 · letzter Beitrag vom 24. Sep 2005
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von glkgereon
glkgereon

Registriert seit: 16. Mär 2004
2.287 Beiträge
 
#1

AV - Warum?

  Alt 24. Sep 2005, 14:51
Hi

ich habe eine TreeView die ich dynamisch befülle.
da das im laufe des Programms mehrmals vorkommen kann, habe ich mir folgendes überlegt:

Delphi-Quellcode:
procedure UpdateTreeView;
var i:Integer;
begin
  { ... Daten holen etc. ... }
  FTree.Items.Clear; //TreeView leeren
  for i:=0 to Length(FNodes)-1 do //Nodes plattmachen
    if FNodes[i]<>nil then FNodes[i].Free;
  SetLength(FNodes,FGruppen.Count+FLieder.Count); //Array setzen
  for i:=0 to Length(FNodes)-1 do //Nodes erstellen
    FNodes[i]:=TTreeNode.Create(FTree.Items);
  { ... Nodes setzen und in TreeView rein ... }
end;
aber beim Free'en der Nodes kommt es immer zu ner AV (Wenn sie schon exitieren)
wenn ich die schleife weglasse habe ich ein monster-Speicherleck was eigentlich nur daher kommen kann.

weiss einer was daran falsch ist? bzw wie ich es anders machen kann?

Edit: FNodes ist ein array of TTreeNode, FGruppen und FLieder TStringList und FTree eine TreeView.
»Unlösbare Probleme sind in der Regel schwierig...«
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: AV - Warum?

  Alt 24. Sep 2005, 14:55
Moin Gereon,

und an welcher Stelle kommt die AV?
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von glkgereon
glkgereon

Registriert seit: 16. Mär 2004
2.287 Beiträge
 
#3

Re: AV - Warum?

  Alt 24. Sep 2005, 14:59
Wenn diese Procedure das zweite mal durchlaufen wird (Also Length(FNodes)>0 bzw die Nodes erstellt sind) direkt beim ersten FNodes[i].Free;
Im codeausschnitt also Zeile 7

Zitat:
---------------------------
Benachrichtigung über Debugger-Problem
---------------------------
Im Projekt C:\Dokumente und Einstellungen\Administrator\Eigene Dateien\Borland Studio-Projekte\mp3Org\Project1.exe sind zu viele auseinanderfolgende Exceptions aufgetreten: ''Zugriffsverletzung bei 0x00000000: Lesen von Adresse 0x00000000''. Prozess wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen.
---------------------------
OK Hilfe
---------------------------
was mich wundert: Adresse 0x00.... sollte doch nil sein...also das Free gar nicht aufgerufen werden
»Unlösbare Probleme sind in der Regel schwierig...«
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: AV - Warum?

  Alt 24. Sep 2005, 15:01
Moin Gereon,

wenn FNodes[i] = nil ist darfst Du FNodes[i].Free nicht aufrufen, also vorher prüfen.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von glkgereon
glkgereon

Registriert seit: 16. Mär 2004
2.287 Beiträge
 
#5

Re: AV - Warum?

  Alt 24. Sep 2005, 15:04
mach ich doch

Delphi-Quellcode:
for i:=0 to Length(FNodes)-1 do //Nodes plattmachen
  if FNodes[i]<>nil then FNodes[i].Free;
Ausserdem kommt ja gerade dann die exception wenn FNodes[i] ungleich nil ist...
»Unlösbare Probleme sind in der Regel schwierig...«
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: AV - Warum?

  Alt 24. Sep 2005, 15:07
Moin Gereon,


hatte ich übersehen.

Was enthält denn FNodes[i]?
Wenn Du da im Einzelschritt durchgehst, kannst Du es Dir ja anzeigen lassen.

Das der Aufruf von Free den Inhalt nicht auf nil setzt ist klar?
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von glkgereon
glkgereon

Registriert seit: 16. Mär 2004
2.287 Beiträge
 
#7

Re: AV - Warum?

  Alt 24. Sep 2005, 15:14
da weiss ich ehrlich gesagt nicht wie ich da drankommen soll

es ist ein array of TTreeNode in einer Klasseninstanz dessen deklaration in ner anderen Unit steckt...geht das überhauot mit der "Liste überwachter Ausdrücke"?
»Unlösbare Probleme sind in der Regel schwierig...«
  Mit Zitat antworten Zitat
Benutzerbild von JasonDX
JasonDX
(CodeLib-Manager)

Registriert seit: 5. Aug 2004
Ort: München
1.062 Beiträge
 
#8

Re: AV - Warum?

  Alt 24. Sep 2005, 15:17
Zitat von Christian Seehase:
Das der Aufruf von Free den Inhalt nicht auf nil setzt ist klar?
Genau das könnte die Fehlerquelle sein
Dieser Code
Delphi-Quellcode:
with TObject.Create do
begin
  Free;
  Free;
end;
Bringt eine (wahrscheinlich die) exception.
Mögliche Lösung: Nicht TObject.Free verwenden, sondern FreeAndNil(TObject)

btw: if Obj <> nil then Obj.Free bringt nix. In Free selbst wird schon überprüft: if self <> nil then Destroy();
Mike
Passion is no replacement for reason
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#9

Re: AV - Warum?

  Alt 24. Sep 2005, 15:19
Hi Gereon,

hast du dynamisch angeforderten Speicher an deine Knoten geknüpft, dann kannst du diesen einfach und sicher im Ereignis OnDeletion() der TreeView wieder freigeben. Außerdem würde ich keine TreeNodes in einer externen Struktur speichern. Es genügt der Data-Ponter des TreeNode auf seine zugehörigen Daten in deiner externen Struktur.

Grüße vom marabu
  Mit Zitat antworten Zitat
Benutzerbild von glkgereon
glkgereon

Registriert seit: 16. Mär 2004
2.287 Beiträge
 
#10

Re: AV - Warum?

  Alt 24. Sep 2005, 15:23
hmm, also ich verstehe nicht so ganz was du meinst...

ich kann die Nodes ja nicht "in" der TreeView selber speichern, oder?
afaik müssen die ja in einem seperaten array abgelegt sein.
oder liegt da der denkfehler?
»Unlösbare Probleme sind in der Regel schwierig...«
  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 04:32 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