AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen FreePascal specialize TFPGObjectList : AV bei Free
Thema durchsuchen
Ansicht
Themen-Optionen

specialize TFPGObjectList : AV bei Free

Ein Thema von Alter Mann · begonnen am 2. Apr 2016 · letzter Beitrag vom 3. Apr 2016
Antwort Antwort
Alter Mann

Registriert seit: 15. Nov 2003
Ort: Berlin
934 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

specialize TFPGObjectList : AV bei Free

  Alt 2. Apr 2016, 17:33
Hallo,

da das mit den Rescourcen klappt, kommt das nächste Problemchen mit specialize TFPGObjectList
Folgendes ist gegeben
Code:
type
  TSmileyInfo = record
    Character : Integer;
    Resource : Integer;
  end;

  TSmiley  = class(TObject)
  private
    FCharacter : Integer;
    FImage    : TPicture;
  public
    constructor Create(aCharacter : Integer; aImage : TPicture);
    destructor Destroy; override;

    procedure render(deviceContext : HDC; X, Y : Integer);
    property Character : Integer read FCharacter;
  end;

  Smileys      = specialize TFPGObjectList<TSmiley>;

  TSmileys     = class(TObject)
  private
    FSmileys   : Smileys;
  protected
    procedure Load(aSmileyInfo : TSmileyInfo);
    function Find(aCharacter : Integer): TSmiley;
  public
    constructor Create;
    destructor Destroy; override;
    procedure  renderSmiley(aCharacter : Integer; deviceContext : HDC; X, Y : Integer);
  end;
In TSmileys.FSmileys werden 845 Smileys geladen:
Code:
...
constructor TSmileys.Create;
var
  I : Integer;
begin
  inherited Create;
  FSmileys := Smileys.Create(True);

  for I := Low(TSmileyList) to High(TSmileyList) do
    Load(TSmileyList[I]);
end;

procedure  TSmileys.Load(aSmileyInfo : TSmileyInfo);
begin
  FSmileys.Add(TSmiley.Create(aSmileyInfo.Character,
    ResourceLoader.loadImageFromResource(aSmileyInfo.Resource, itPNG)));
end;
...
Das Problem taucht nun beim freigeben auf, egal wie ich es mache, es kommt zu einer AV
Code:
...
constructor TSmiley.Create(aCharacter : Integer; aImage : TPicture);
begin
  inherited Create;
  FCharacter := aCharacter;
  FImage    := aImage;
end;

destructor TSmiley.Destroy;
begin
  if Assigned(FImage) then
    FImage.Free;              <- Hier
  inherited Destroy;
end;
...
destructor TSmileys.Destroy;
var
  Smiley : TSmiley;
begin
  for Smiley in FSmileys do
    if Assigned(Smiley) then
       Smiley.Free;

  FSmileys.Free;
  inherited Destroy;
end;
...
Das blöde ist nur das es immer bei einem anderen Picture kommt.

Wie kann ich das Image(TPicture) freigeben ohne das Knallt?
FreeAndNil geht auch nicht.
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.004 Beiträge
 
Delphi 2009 Professional
 
#2

AW: specialize TFPGObjectList : AV bei Free

  Alt 2. Apr 2016, 17:57
Wie kann ich das Image(TPicture) freigeben ohne das Knallt?
Besteht das Problem auch, wenn anstatt eines TImage eine andere Klasse, die weniger 'sensibel' ist (also zumBeispiel TStringList, TButton, ...) als Typ der Property TSmiley.FImage verwendet wird?
Michael Justin
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#3

AW: specialize TFPGObjectList : AV bei Free

  Alt 2. Apr 2016, 18:11
Ich sehe, dass die Referenz auf FImage im Constructor reingegeben - und nicht intern erzeugt wird. Vermutlich wird die Instanz durch irgendeinen Logikfehler deshalb mehrfach freigegeben.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Alter Mann

Registriert seit: 15. Nov 2003
Ort: Berlin
934 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

AW: specialize TFPGObjectList : AV bei Free

  Alt 2. Apr 2016, 19:09
@Zacherl

Ich werde morgen mal FImage initialisieren und das übergebene Picture via Assing zuweisen,
mal sehen vielleicht geht das ja.

Danke erstmal und noch einen schönen Abend

Update:

Also eine Änderung in:
Code:
constructor TSmiley.Create(aCharacter : Integer; aImage : TPicture);
begin
  inherited Create;
  FCharacter := aCharacter;
  FImage    := TPicture.Create;
  FImage.Assign(aImage);
end;
bringt auch nichts .

Geändert von Alter Mann ( 2. Apr 2016 um 19:23 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.297 Beiträge
 
Delphi 12 Athens
 
#5

AW: specialize TFPGObjectList : AV bei Free

  Alt 3. Apr 2016, 06:35
Moin...

Du erzeugst die Objektliste mit OwnsObjects = True und gibst im destructor selbst die enthaltenen Bilder wieder frei. Das muß Puff machen... Wenn du die Instanzen selbst verwalten möchtest dann OwnsObjects auf False. Dann würde das mit der Freigabe passen. Dann brauchst du aber auch nicht auf Assigned prüfen. Jeder Listeneintrag ist ein Pointer.
Delphi-Quellcode:
FSmileys := Smileys.Create(True); // OwnsObjects = True
.
.
.
destructor TSmileys.Destroy;
var
  Smiley : TSmiley;
begin
// for Smiley in FSmileys do // diesen Block brauchst du nicht
// if Assigned(Smiley) then
// Smiley.Free; //

  FSmileys.Free;
  inherited Destroy;
end;
..fertsch.
  Mit Zitat antworten Zitat
Alter Mann

Registriert seit: 15. Nov 2003
Ort: Berlin
934 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

AW: specialize TFPGObjectList : AV bei Free

  Alt 3. Apr 2016, 08:00
Ja, sieht ganz so aus.

Ich habe es jetzt so gemacht und es geht
Code:
...
destructor TSmiley.Destroy;
begin
  FPicture.Free;
  inherited Destroy;
end;
...
destructor TSmileys.Destroy;
begin
  FSmileys.Clear;
  FSmileys.Free;
  inherited Destroy;
end;
Danke
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.297 Beiträge
 
Delphi 12 Athens
 
#7

AW: specialize TFPGObjectList : AV bei Free

  Alt 3. Apr 2016, 10:54
Siehst du... again what learned.

Das FSmileys.Clear; kannst du auch weglassen. Das wird beim Free automatisch gemacht. Um Daniel zu zitieren: "Verschwendung von wertvollen Bits und Bytes"
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: specialize TFPGObjectList : AV bei Free

  Alt 3. Apr 2016, 11:51
Und es geht noch kürzer:
Delphi-Quellcode:
destructor TSmileys.Destroy;
begin
  FSmileys.Free;
  inherited;
end;
Da der Destruktor dieselbe Signatur hat wie der geerbte, kann der explizite Aufruf entfallen.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.297 Beiträge
 
Delphi 12 Athens
 
#9

AW: specialize TFPGObjectList : AV bei Free

  Alt 3. Apr 2016, 13:45
...den hatte ich gar nicht gesehen weil selbstverfreilich.
  Mit Zitat antworten Zitat
Antwort Antwort


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 01: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