AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Wie Mehrfachfreigabe eines Objektes verhindern?
Thema durchsuchen
Ansicht
Themen-Optionen

Wie Mehrfachfreigabe eines Objektes verhindern?

Ein Thema von TheMiller · begonnen am 24. Feb 2010 · letzter Beitrag vom 24. Feb 2010
Antwort Antwort
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#1

Wie Mehrfachfreigabe eines Objektes verhindern?

  Alt 24. Feb 2010, 17:10
Hallo,

wieder ich

Ich hab grad noch ein Problem mit der Freigabe von Objekten. Ich habe zwei Objekte, die beide eine Referenz zu einem dritten Objekt haben. Wenn ich nun Objekt1 freigebe, wird automatisch Objekt3 freigegeben. Das rührt von der ObjectList, die die Eigenschaft OwnsObjects auf "True" stehen hat.

Wenn ich nun das Objekt2 freigebe (auch eine ObjectList), will diese natürlich auch wieder Objekt3 freigeben und es knallt.

Meine Frage ist jetzt, ob ich dieses Freigabeverhalten durch eine Prüfung beeinflussen kann. Oder muss ich deswegen OwnsObjects auf "False" stellen?

Danke im Voraus
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.201 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: Wie Mehrfachfreigabe eines Objektes verhindern?

  Alt 24. Feb 2010, 17:17
OwnerObject = False oder alles auf Interfaces umstellen
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#3

Re: Wie Mehrfachfreigabe eines Objektes verhindern?

  Alt 24. Feb 2010, 17:20
Daraum darf immer nur einwas die Kontrolle über die Freigabe eines Objektes bestimmen.

Bei Interfaces und anderen Dingen mit Referenzzählung liegt die "Gewalt" Beim Object [3] selber, da es mitzählt, wie oft es verwendet wird.
(PS: sowas kann man auch für Objekte realisieren)

Problem hierbei wird sein, daß das eine Objekt [1], bzw. deren Objektlist [1] oder das freizugebende Objekt [3] nichts von dem anderen Objekt [2] und dessen Objektliste [2] weiß.
Wenn doch, dann muß das Objekt [3] dort aus einer der beiden Listen [1 oder 2] gelöscht werden.
- entweder aus Liste [1] ohne es [3] freizugeben
- oder aus Liste [2] anschließendem Freigeben, zusammen mit Liste [1]
- oder man implementiert eine Referenzzählung und läßt das Objekt [3] entscheiden
- oder man übergibt die Kontrolle einer weiteren Partei [4], welche weiß wo oder wie oft es [3] verwendet wird ... praktisch ähnlich der Referenzzählung
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#4

Re: Wie Mehrfachfreigabe eines Objektes verhindern?

  Alt 24. Feb 2010, 17:22
Mit Interfaces kenne ich mich noch nicht aus. Also kümmer ich mich selbst erstmal um die Freigabe, bis ich weis, was Interfaces sind, was sie können und wozu man sie konkret braucht. Ein bissl weis ich ja, aber zum Programmieren reicht's noch nicht.

Danke

@himitsu: Vielen Dank für deinen ausführlichen Post. Ich werde sehen, wie ich meine Zwickmühle hier jetzt löse und mich dann mal um Interfaces kümmern. Danke
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#5

Re: Wie Mehrfachfreigabe eines Objektes verhindern?

  Alt 24. Feb 2010, 17:35
Zitat von DJ-SPM:
Wenn ich nun das Objekt2 freigebe (auch eine ObjectList), will diese natürlich auch wieder Objekt3 freigeben und es knallt
Einfache Daumenregel:

Zitat:
"wer Objekte erstellt, ist auch dafür zuständig, sie wieder freizugeben."
OwnsObjects=True ist nur dann sicher, wenn ein Objekt nicht gleichtzeitig in mehreren Listen mit OwnsObjects=True enthalten ist. Nicht sicher zu wissen, welche Objektliste ein Objekt besitzen und freigeben soll, würde schon in die Rubrik 'böser Designfehler' passen.
Michael Justin
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#6

Re: Wie Mehrfachfreigabe eines Objektes verhindern?

  Alt 24. Feb 2010, 17:38
Delphi-Quellcode:
type
  TReferenceObject = class
  private
    FReferences: Integer;
  public
    procedure FreeInstance; override;
    procedure IncRef;
    procedure DecRef;
  end;

procedure TReferenceObject.FreeInstance;
begin
  if FReferences = 0 then
    inherited FreeInstance;
end;

procedure TReferenceObject.IncRef;
begin
  Inc(FReferences);
end;

procedure TReferenceObject.DecRef;
begin
  Dec(FReferences);
end;
Allerdings muß man hier aufpassen, daß .IncRef und .DecRef ordentlich gesetzt und auch wieder zurückgesetzt werden, sonst bekommt man Probleme.
Delphi-Quellcode:
Obj := TObj.Create;
Obj.IncRef;

Obj2 := Obj;
Obj2.IncRef;

Obj.DecRef;
Obj.Free;

Obj2.DecRef;
Obj2.Free; // erst hier wird das Objekt freigegeben
Delphi-Quellcode:
Obj := TObj.Create;
Obj.IncRef;

Obj2 := Obj;
Obj2.IncRef;

Obj2.DecRef;
Obj2.Free;

Obj.DecRef;
Obj.Free; // erst hier wird das Objekt freigegeben
Bei Interfaces zählt Delphi aufomatisch mit und sorgt selber für's Freigeben, somit kann man sich nicht verzählen.
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#7

Re: Wie Mehrfachfreigabe eines Objektes verhindern?

  Alt 24. Feb 2010, 17:49


Vielen Dank für den Quelltext. Das mit der Referenzzählung habe ich schon irgendwo mal gesehen. Naja, wie auch immer - um die Interfaces komm ich nicht drumrum - schon alleine, weil ich die irgendwie cool und professionell finde - daher: Lernen!

Aber erstmal setze ich dein Codebeispiel um.
  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 10:22 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