AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Speicherleck bei Verwendung von TInterfacedPersistent?
Thema durchsuchen
Ansicht
Themen-Optionen

Speicherleck bei Verwendung von TInterfacedPersistent?

Ein Thema von squetk · begonnen am 19. Okt 2007 · letzter Beitrag vom 19. Okt 2007
Antwort Antwort
Seite 1 von 2  1 2      
squetk

Registriert seit: 29. Aug 2004
Ort: Cottbus
118 Beiträge
 
Delphi XE2 Professional
 
#1

Speicherleck bei Verwendung von TInterfacedPersistent?

  Alt 19. Okt 2007, 01:52
Hallo,

leite ich Klassen von TInterfacedPersistent ab, meldet mir FastMM, dass diese Klasse ein Speicherleck verursacht.
Folgendes Beispiel:
Delphi-Quellcode:
unit ClassesSB;

interface

uses SysUtils, Classes;

type
  ISBParam = interface(IInterface)
    ['{3A2C91E1-9935-436B-BCCE-489F0615F5D1}']
    function GetValue(const sParamFieldName : string; const iParamType : integer) : string;
  end;

  TSBParamClass = class of TSBParam;

  TSBParam = class(TInterfacedPersistent, ISBParam)
  //TSBParam = class(TInterfacedObject, ISBParam)
  private
  public
    function GetValue(const sParamFieldName : string; const iParamType : integer) : string; virtual;
  end;

  TSBParamTest = class(TSBParam)
  private
  public
    function GetValue(const sParamFieldName : string; const iParamType : integer) : string; override;
  end;

implementation

{ TSBParam }

function TSBParam.GetValue(const sParamFieldName: string;
  const iParamType: integer): string;
begin
  Result := '';
end;

{ TSBParamTest }

function TSBParamTest.GetValue(const sParamFieldName: string;
  const iParamType: integer): string;
begin
  Result := Format('Param=%s Type=%d', [sParamFieldName, iParamType]);
end;

initialization

  RegisterClasses([TSBParamTest]);


end.
Und so wird es verwendet:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var sbParam : ISBParam;
begin
  sbParam := TSBParamClass(FindClass('TSBParamTest')).Create;
  //sbParam := TSBParamTest.Create;
  ShowMessage(sbParam.GetValue('FieldName', 1));
end;
Nutze ich TInterfacedObject als Basisklasse (Kommentare), ist FastMM zufrieden. Allerdings hatte ich vor, die Klassen aus dem Namen als Text zu erzeugen (die Klassennamen sind extern gespeichert), und FindClass arbeitet nur mit Derivaten von TPersistentClass.

Sicher wäre es ein Wordaround, das FindClass mit einer eigenen Listenklasse nachzubilden - aber den Aufwand würde ich mir gern sparen. Ausserdem interessiert es mich, ob wirklich ein Speicherleck entsteht oder FastMM hier eine Falschmeldung produziert.
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#2

Re: Speicherleck bei Verwendung von TInterfacedPersistent?

  Alt 19. Okt 2007, 02:33
Ich kann es nicht beweisen, aber ich vermute mal ins blaue, dass TInterfacedPersistent die Referenzzählung aushebelt. Produziert folgender Code ein Leck?
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var sbParam : ISBParam; temp: TSBParamClass;
begin
  temp := TSBParamClass(FindClass('TSBParamTest')).Create;
  sbParam := temp;
  //sbParam := TSBParamTest.Create;
  ShowMessage(sbParam.GetValue('FieldName', 1));
  temp.Free;
end;
  Mit Zitat antworten Zitat
squetk

Registriert seit: 29. Aug 2004
Ort: Cottbus
118 Beiträge
 
Delphi XE2 Professional
 
#3

Re: Speicherleck bei Verwendung von TInterfacedPersistent?

  Alt 19. Okt 2007, 02:39
Es gibt beim temp.Free eine Schutzverletzung - ist das eventuell ein Indiz dafür, dass FastMM eine Speicherleck-Falschmeldung produziert?
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#4

Re: Speicherleck bei Verwendung von TInterfacedPersistent?

  Alt 19. Okt 2007, 02:43
Args! Ich sollte nicht so spät noch Fragen beantworten... Das sollte natürlich TSBParam in der Variablendeklaration heißen, nicht TSBParamClass *schämt sich in grund und boden*
  Mit Zitat antworten Zitat
squetk

Registriert seit: 29. Aug 2004
Ort: Cottbus
118 Beiträge
 
Delphi XE2 Professional
 
#5

Re: Speicherleck bei Verwendung von TInterfacedPersistent?

  Alt 19. Okt 2007, 02:49
Da hat mich schon der Compiler drauf aufmerksam gemacht, das war also nicht die Ursache für die Schutzverletzung, die Variablendeklaration hatte ich berichtigt.
Zitat:
Ich sollte nicht so spät noch Fragen beantworten...
Spät? Ich finds eher früh
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#6

Re: Speicherleck bei Verwendung von TInterfacedPersistent?

  Alt 19. Okt 2007, 02:53
Zitat von squetk:
Spät? Ich finds eher früh
Sag das mir, so ich seit Wochen nich mehr richtig und seit gestern garnich mehr schlafen kann.. Aber zum Thema: wenn es selbst bei einer richtigen Deklaration der Variablen eine Schutzverletzung gibt, würde ich diese Konstellation zum einen mit einem anderen Memorymanager ausprobieren (sollte das selbe Ergebnis liefern) und in einem anderen Test die Interfaces weglassen. Wie dein Leck zustande kommt, entzieht sich meiner Erkenntnis.. Und die AV deutet auf einen schweren Fehler in einem anderen Programmteil hin. Hast du eventuell Destroy überschrieben und inherited nicht drin? Oder noch schlimmer, Free redeklariert?
  Mit Zitat antworten Zitat
squetk

Registriert seit: 29. Aug 2004
Ort: Cottbus
118 Beiträge
 
Delphi XE2 Professional
 
#7

Re: Speicherleck bei Verwendung von TInterfacedPersistent?

  Alt 19. Okt 2007, 03:01
Nein - solch schlimme Sachen habe ich nicht gemacht. Alles was ich gecodet habe, ist im ersten Beitrag zu sehen - ganz harmlos.
Sobald ich statt TInterfacedPersistent TInterfacedObject verwende, habe ich ja das gewünschte Ergebnis. Dann kann ich aber FindClass nicht nutzen.
Ich habe mal in den Sourcen nachgeschaut (Classes.pas), dort werden die Methoden _AddRef etc. bei TInterfacedPersistent anders implementiert als bei TInterfacedObject. Merkwürdig.
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#8

Re: Speicherleck bei Verwendung von TInterfacedPersistent?

  Alt 19. Okt 2007, 03:03
Also wie vermutet, die Referenzzählung wird ausgehebelt.. Was in dem Fall das beste Vorgehen ist kann ich nicht sagen, aber wenn du auf die Referenzzählung angewiesen bist, könntest du versuchsweise die Implementation aus TInterfacedObject in deine Basisklasse packen (und eventuell dort behalten).
  Mit Zitat antworten Zitat
squetk

Registriert seit: 29. Aug 2004
Ort: Cottbus
118 Beiträge
 
Delphi XE2 Professional
 
#9

Re: Speicherleck bei Verwendung von TInterfacedPersistent?

  Alt 19. Okt 2007, 03:07
Also eine Klasse von TInterfacedPersistent ableiten und dann das Referenz-Handling von TInterfacedPersistent mit der Implementation von TInterfacedObject überschreiben?
Klingt nicht übel.
Mal schaun ob das klappt.
  Mit Zitat antworten Zitat
squetk

Registriert seit: 29. Aug 2004
Ort: Cottbus
118 Beiträge
 
Delphi XE2 Professional
 
#10

Re: Speicherleck bei Verwendung von TInterfacedPersistent?

  Alt 19. Okt 2007, 05:56
Komisch: Ich habe eine Klasse TPatchInterfacedPersistent von TInterfacedPersistent abgeleitet und die _AddRef und _Release-Methoden und alle weiteren mit der Implementation von TInterfacedObject überschrieben und die das Interface implementierenden Klassen davon abgeleitet - trotzdem kommt es zum Speicherleck.

Da scheint ein anderes Problem in TInterfacedPersistent verborgen zu sein.

Ich werde wohl das Handtuch schmeissen und eine eigene Listenklasse coden, die mir die FindClass-Funktionalität liefert. Dann können meine implementierenden Klassen von TInterfacedObject abgeleitet sein und es herrscht eitel Sonnenschein.
  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 06:02 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