AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Freigeben -> AV; Bearbeiten -> Nichts weiter
Thema durchsuchen
Ansicht
Themen-Optionen

Freigeben -> AV; Bearbeiten -> Nichts weiter

Ein Thema von xZise · begonnen am 23. Feb 2009 · letzter Beitrag vom 27. Mär 2009
Antwort Antwort
Seite 2 von 4     12 34      
angos

Registriert seit: 26. Mai 2004
Ort: Rheine
549 Beiträge
 
Delphi 11 Alexandria
 
#11

Re: Freigeben -> AV; Bearbeiten -> Nichts weiter

  Alt 26. Feb 2009, 16:49
Hi,

ich hatte schon 2, 3 Male ein ähnliches Phänomen. Selbst bei noch eindeutigeren "Nicht-Fehlern" im Code

eine Funktion hat eine Exception geworfen. Zum prüfen habe ich folgende Änderungen im Code vorgenommen:

Delphi-Quellcode:
function XYZ;
var
  s: string; // geändert
  i: Integer;
begin
  [...]
  s := IntToStr(i); // geändert
  [...]
  ShowMessage(s); // geändert
  [...]
end;
danach kam die Exception nicht mehr.
Auskommentieren dieser Zeilen hat die Exception zurückgebracht. Bei mir im Betrieb waren alle Entwickler ratlos.
Also habe ich mal alle *.dcu und ProjektName.* außer der Projektname.dpr.

Danach Projekt neu erzeugt und alles hat wieder einwandfrei funktioniert.

Vielleicht verschluckt sich Delphi bei dir auch an irgend wo einer Kleinigkeit.


Gruß

Ansgar
Ansgar
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.349 Beiträge
 
Delphi 11 Alexandria
 
#12

Re: Freigeben -> AV; Bearbeiten -> Nichts weiter

  Alt 26. Feb 2009, 17:16
Das sind meistens alles Symptome für Speicherprobleme. Leider tritt, wenn man den falschen Speicher überschreibt z.B., der Fehler oft am anderen Ende des Projekts auf und ist dort unerklärlich.
Und leider ist so etwas nicht unbedingt reproduzierbar.

Und leider können ganz andere Änderungen, die eigentlich nichts damit zu tun haben das Problem verdecken. Sei es eine zusätzliche Variable, ein zusätzlicher Befehl, der eigentlich gar nix macht, oder sowas.
Eine nicht computerbezogene Erklärung habe ich dazu einmal hier geschrieben:
http://www.delphi-forum.de/viewtopic...=527022#527022

Deshalb sind die Hinweise von Delphi auf Speicherlecks sehr Ernst zu nehmen. Irgendetwas stimmt da definitiv nicht. Ich habe nur gerade bis eben an einem eigenen Projekt gearbeitet, so dass ich mich da nicht drum kümmern konnte. Ich schau es mir gleich noch einmal genauer an.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#13

Re: Freigeben -> AV; Bearbeiten -> Nichts weiter

  Alt 26. Feb 2009, 17:48
Zitat von jaenicke:
Das sind meistens alles Symptome für Speicherprobleme. Leider tritt, wenn man den falschen Speicher überschreibt z.B., der Fehler oft am anderen Ende des Projekts auf und ist dort unerklärlich.
Und leider ist so etwas nicht unbedingt reproduzierbar.
Genau das ist das Problem, und genau deshalb glaube ich, dass ich irgendwo in den Listen unsauber gearbeitet habe.

Zitat von jaenicke:
Deshalb sind die Hinweise von Delphi auf Speicherlecks sehr Ernst zu nehmen. Irgendetwas stimmt da definitiv nicht. Ich habe nur gerade bis eben an einem eigenen Projekt gearbeitet, so dass ich mich da nicht drum kümmern konnte. Ich schau es mir gleich noch einmal genauer an.
Genau deshalb verwenden wir im eigentlich Projekt die alten Varianten, aber die neue ist halt (meiner Meinung nach) besser
Da der Fehler auftritt, wenn ich eine von beiden neuen Listen verwende, glaube ich, liegt es an der TMainList.

MfG
xZise
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.349 Beiträge
 
Delphi 11 Alexandria
 
#14

Re: Freigeben -> AV; Bearbeiten -> Nichts weiter

  Alt 26. Feb 2009, 18:36
Was mir auffällt:
Delphi-Quellcode:
procedure TMainList.Clear;
begin
  FCount := 0;
  case FReserveManagment of
    rmExact, rmProgressive: begin
      FReservedLength := 0;
    end;
  end;
end;

und

destructor TMainList.Destroy;
begin
  inherited;
end;
Müsste nicht in beiden Fällen Speicher freigegeben werden?
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#15

Re: Freigeben -> AV; Bearbeiten -> Nichts weiter

  Alt 26. Feb 2009, 19:40
Also ich bin mir da nicht so sicher. Bei Clear sollte ich das Array wirklich einmal resizen. Aber ansonsten ist das ja ein dynamisches array von TVarRec, welches ja an sich automatisch "freigegeben" wird?

MfG
xZise
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.349 Beiträge
 
Delphi 11 Alexandria
 
#16

Re: Freigeben -> AV; Bearbeiten -> Nichts weiter

  Alt 26. Feb 2009, 19:47
Naja, was heißt automatisch freigegeben, ich sehe kein SetLength(..., 0), und das müsste da eigentlich irgendwo stehen. Denn sonst gibts doch erstmal noch eine Referenz auf die Objekte und der Referenzzähler wird nach dem Freigeben der Liste nicht 0. Denn deren Freigabe zerstört zwar die Referenzen, aber das passiert ja nicht explizit.

Ich hab gerade mal in die Implementierung von TList geschaut, daran solltest du dich vielleicht orientieren:
Delphi-Quellcode:
destructor TList.Destroy;
begin
  Clear;
end;

procedure TList.Clear;
begin
  SetCount(0);
  SetCapacity(0);
end;
Das heißt da wird durchaus explizit gelöscht.

Sicher bin ich mir über die Interna der Referenzzählung aber aus dem Kopf auch nicht, da schaue ich immer in den generierten Assemblercode, wenn ich nicht sicher bin.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#17

Re: Freigeben -> AV; Bearbeiten -> Nichts weiter

  Alt 26. Feb 2009, 19:50
Okay habe ich eigentlich auch:
Delphi-Quellcode:
destructor TMainList.Destroy;
begin
  Clear;
  ResizeArray(0);
  inherited;
end;

procedure TMainList.Clear;
begin
  FCount := 0;
  case FReserveManagment of
    rmExact, rmProgressive: begin
      FReservedLength := 0;
    end;
  end;
  ResizeArray(FReservedLength);
end;
Aber es kommt weiterhin der Fehler und die Speicherlecks sind weiterhin vorhanden.

MfG
xZise
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.349 Beiträge
 
Delphi 11 Alexandria
 
#18

Re: Freigeben -> AV; Bearbeiten -> Nichts weiter

  Alt 26. Feb 2009, 19:52
Um genauer zu schauen wo die Speicherlecks liegen solltest du dir einmal FastMM anschauen und die Überprüfung aktivieren.

Und dann gibts da noch madExcept oder EurekaLog, die zum Debuggen sehr gut sind.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Benutzerbild von dataspider
dataspider

Registriert seit: 9. Nov 2003
Ort: 04539 Groitzsch
1.350 Beiträge
 
Delphi 11 Alexandria
 
#19

Re: Freigeben -> AV; Bearbeiten -> Nichts weiter

  Alt 27. Feb 2009, 06:48
Hi,

mir ist beim Lesen auch noch etwas aufgefallen:

Delphi-Quellcode:
procedure TIntegerListList.Delete(const AIndex: Integer);
begin
  // next condition can not be True - or statt and
  // genau so in: TIntegerListList.GetIntegerLists
  if (AIndex < 0) and (AIndex >= Count) then
    raise EIntegerListListError.CreateFmt(SListIndexError, [AIndex]);
  FIntegerLists.Delete(AIndex);
  FHeadInteger.Delete(AIndex);
  Dec(FCount);
end;
Delphi-Quellcode:
procedure TZeilenListe.Delete(AIndexes: TIntegerList);
var
  i: Integer;
begin
  for i := 0 to AIndexes.Count - 1 do
    Delete(AIndexes[i]);
end;
Kannst du garantieren, dass AIndexes absteigend sortiert ist? Sonst löscht du die falschen oder bist plötzlich ausserhalb des Bereiches.

Cu, Frank
Frank Reim
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#20

Re: Freigeben -> AV; Bearbeiten -> Nichts weiter

  Alt 27. Feb 2009, 07:22
Ah okay.

Normalerweise denke ich immer an die Rückwärtige Schleife. Ich probiere es gleich mal aus!

Aber du meinst die falsche TIntegerListList ^^, aber wenn ich die Schleife in UZeilen umdrehe hat das keine Auswirkung.

Und wie sieht es mit FastMM aus? Also ich habe mir jetzt FastMM4 gedownloadet, aber wie erhalte ich genauere Angaben?

MfG
xZise
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 4     12 34      


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 07:43 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