![]() |
Freigabe von Objekten in Objekten
Hallo ich habe ein Objekt erstellt, dass ein Objekt erstellt, welches wiederum ein Objekt erstellt.
Nun passiert es bei der Freigabe des Innersten Objektes, das ich ein Speicherzugriffsfehler bekomme. Dieser tritt auf wenn der Destructor des Innersten Objektes aufgerufen wird. Hier ist der Quelltext( die Stelle wo der Fehler autritt ist gekennzeichnet) :
Delphi-Quellcode:
unit Unit2;
interface uses Classes, SysUtils, Variants, Math, Grids, Forms, Dialogs, Controls, StdCtrls, Windows, Messages, Graphics, Unit3; type TObjektMit2Objekten = class public Objekt1 : TObjekt1; constructor Create(ZuBenutzendesFormular : TWinControl); destructor Destroy; override; end; implementation constructor TObjektMit2Objekten.Create(ZuBenutzendesFormular : TWinControl); begin inherited Create; Objekt1 := TObjekt1.Create(ZuBenutzendesFormular,1); Objekt1 := TObjekt1.Create(ZuBenutzendesFormular,2); end; destructor TObjektMit2Objekten.destroy; begin Objekt1.free; Inherited destroy; end; end.
Delphi-Quellcode:
unit Unit3;
interface uses Classes, SysUtils, Variants, Math, Grids, Forms, Dialogs, Controls, StdCtrls, Windows, Messages, Graphics; type TObjekt2 = class(TEdit) public constructor Create(AOwner: TComponent); override; end; TObjekt1 = class(TStringGrid) public Objekt2 : TObjekt2; constructor Create(AOwner: TComponent; Anders : byte); reintroduce; destructor destroy; override; end; implementation constructor TObjekt1.Create(AOwner: TComponent; Anders : byte); begin inherited Create(AOwner); Parent := AOwner as TWinControl; case Anders of 1: begin Left := 450; Top := 150; DefaultColWidth := 30; DefaultRowHeight := 30; FixedCols := 0; FixedRows := 0; BorderStyle := bsSingle; ColCount := 8; RowCount := 1; Width := 253; Height := 32; end; 2: begin Objekt2 := TObjekt2.Create(AOwner); Objekt2.Top := 200; Left := 450; Top := 200; DefaultColWidth := 30; DefaultRowHeight := 30; FixedCols := 0; FixedRows := 0; BorderStyle := bsSingle; ColCount := 8; RowCount := 1; Width := 253; Height := 32; end; end; end; destructor TObjekt1.destroy; begin Objekt2.Free; //Fehler ??!! inherited destroy; end; constructor TObjekt2.Create(AOwner: TComponent); begin inherited Create(AOwner); Parent := TWinControl(AOwner); Left := 400; Width := 50; AutoSize := false; Height := 32; Font.Size := 16; Text := 'Objekt2'; end; end. |
Re: Freigabe von Objekten in Objekten
Tritt der Fehler noch auf, wenn du am Anfang der Konstruktors von TObjekt1 "Objekt2 := nil;" schreibst?
Edit: ich seh grad, bei
Delphi-Quellcode:
erzeugst du aber ein MemLeak, da dir die erste Referenz verloren geht.
Objekt1 := TObjekt1.Create(ZuBenutzendesFormular,1);
Objekt1 := TObjekt1.Create(ZuBenutzendesFormular,2); |
Re: Freigabe von Objekten in Objekten
Delphi-Quellcode:
Eine Variable, aber 2 Objekte ... ergo, wwird das 1. nie freigegeben, da dessen Referenz durch das Zweite überschrieben wird !
Objekt1 := TObjekt1.Create(ZuBenutzendesFormular,1);
Objekt1 := TObjekt1.Create(ZuBenutzendesFormular,2); der Owner (Besitzer) von Objekt 2 ist ja wohl das Objekt 1
Delphi-Quellcode:
Objekt2 := TObjekt2.Create(Self);
|
Re: Freigabe von Objekten in Objekten
Hier dürfte der Fehler liegen:
Delphi-Quellcode:
Du willst dein eines Objekt 2x erzeugen, geht aber nicht ^^
Objekt1 := TObjekt1.Create(ZuBenutzendesFormular,1);
Objekt1 := TObjekt1.Create(ZuBenutzendesFormular,2); Gruß Teekeks Edit: arg, zu langsam, aber egal |
Re: Freigabe von Objekten in Objekten
Außerdem ist es nicht so günstig, das Objekt mit einem anderen Owner zu erzeugen und es dann doch selbst freizugeben.
@Teekeks: das geht schon, aber dann ist die erste Referenz nicht mehr erreichbar. |
Re: Freigabe von Objekten in Objekten
Aso jetzt bin ich aber doch etwas verwirrt also wäre dann
Delphi-Quellcode:
richtig?
Objekt1a := TObjekt1.Create(ZuBenutzendesFormular,1);
Objekt1b := TObjekt1.Create(ZuBenutzendesFormular,2); Was aber auch nicht zu gehen scheint... |
Re: Freigabe von Objekten in Objekten
Verwirrt bin ich auch. Was möchtest Du denn erreichen? Willst Du ein TObjekt1 erzeugen, dass je nach Stand von "Anders" wiederum ein TObjekt2 erzeugt?
[edit] Oder sollen das 2 unterschiedliche TObjekt1 sein? [/edit] |
Re: Freigabe von Objekten in Objekten
Also ich will ein TObjektMit2Objekten erzeugen, dass je nach Stand von "Anders" ein TObjekt1 ohne einem TObjekt2 oder ein TObjekt1 mit einem TObjekt2 erzeugt.
|
Re: Freigabe von Objekten in Objekten
genau; du brauchst für jede Objektinstanz, die du mit "Create" erzeugst, eine Referenz. Sonst kannst du sie später nicht mehr freigeben.
Der eigentliche Fehler liegt aber, glaube ich darin, dass du im Destruktor von TObjekt1 Objekt2 freigibst, obwohl es nirgends erzeugt wurde, zumindest dann, wenn TObjekt1 mit Anders=1 erzeugt wurde. |
Re: Freigabe von Objekten in Objekten
Wenn Objekt2 mit nil initialisiert ist, führt ein Free nicht zum Fehler.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:08 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz