AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Funktion erstellt gibt Objekt zurück, wer räumt auf
Thema durchsuchen
Ansicht
Themen-Optionen

Funktion erstellt gibt Objekt zurück, wer räumt auf

Ein Thema von Luckie · begonnen am 16. Jul 2004 · letzter Beitrag vom 17. Jul 2004
Antwort Antwort
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#1

Funktion erstellt gibt Objekt zurück, wer räumt auf

  Alt 16. Jul 2004, 11:21
Ich habe eine Funktion, die als Ergebnis ein Objekt zurück gibt. Kann man sich so vorstellen:
Delphi-Quellcode:
function foo: TStrings;
begin
  result := TStringList.Create;
  ...;
  ...;

  result.Add('....');
  result.Add('....');
  result.Add('....');
end;
Aufruf:
Listbox1.Items := Foo; Meine Frage: Ich weiß nicht, wo ich den Speicher wieder freigeben soll.

Nachtrag: Normaler weise mache ich so wa smit var Parametern, dann ist der Aufrufer dafür verantwortlich das Objkekt zu erstellen und wieder zu entsorgen, aber hier muss es als read Property eine Funktion sein.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#2

Re: Funktion erstellt gibt Objekt zurück, wer räumt auf

  Alt 16. Jul 2004, 11:42

Ist zwar irgendwie hässlich, sollte aber gehen.


Delphi-Quellcode:
var
  SL :TStrings;
begin
  try
    SL := foo();
    //Do something...
  finally
    if Assigned(SL) then
      Free(SL);
  end;
end;
noch ein Edit:
Sorgt die ListBox nicht von alleine für das Freigeben von TListBox.Items?
Da du Items das Ergebnis von foo übergibst, sollte das nicht dein Problem sein.

  ListBox.Items.Assign(foo());
  Mit Zitat antworten Zitat
supermuckl

Registriert seit: 1. Feb 2003
1.340 Beiträge
 
FreePascal / Lazarus
 
#3

Re: Funktion erstellt gibt Objekt zurück, wer räumt auf

  Alt 16. Jul 2004, 11:45
Delphi-Quellcode:
var
  SL :TStringList;
begin
  try
    SL := foo();
  finally
    if Assigned(SL) then
      Freeandnil(SL);
  end;
end;
Das echte Leben ist was für Leute...
... die im Internet keine Freunde finden!
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#4

Re: Funktion erstellt gibt Objekt zurück, wer räumt auf

  Alt 16. Jul 2004, 16:45
Moin!

Zitat von Robert_G:
noch ein Edit:
Sorgt die ListBox nicht von alleine für das Freigeben von TListBox.Items?
Da du Items das Ergebnis von foo übergibst, sollte das nicht dein Problem sein.
Ist es aber doch: Die ListBox hat intern seine eigene Instanz (öffentlich als Items bekannt). Bei der direkten Zuweisung von einem TStrings Derivat auf Items wird ein Assign() aufgerufen, also die interne Items Instanz übernimmt alle Einträge und killt die alten Einträge vorher. Mit anderen Worten: Nach der Zuweisung existiert weiterhin die alte interne Items Instanz und immernoch deine neue foo() Instanz. Daher muss man die von Foo() erzeugte Instanz freigeben danach - so wie die 2 Codebeispiele das schon machen...

MfG
Muetze1
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#5

Re: Funktion erstellt gibt Objekt zurück, wer räumt auf

  Alt 16. Jul 2004, 17:02
Na klar!

Mit einer Garbage Collection kann einem auf Dauer sogar das Denken abhanden kommen.
Assign übernimmt nicht das neue Object, nachdem es die alte Instanz "aufgeräumt" hat -> es macht sich nur eine Kopie.

Delphi-Quellcode:
var
  SL :TStrings;
begin
  // auch wenn es blöd aussieht...
  // Da du IMHO nicht weißt ab wann die SL erzeugt wird, sollte auch foo() in den Try-Except-Block
  try
    SL := foo();
    ListBox.Items.Assign(SL);
  finally
    if Assigned(SL) then
      Free(SL);
      // FreeAndNill halte ich für unnötig, da man mit SL wohl nix mehr machen wird
  end;
end;
  Mit Zitat antworten Zitat
Benutzerbild von mschaefer
mschaefer

Registriert seit: 4. Feb 2003
Ort: Hannover
2.029 Beiträge
 
Delphi XE3 Enterprise
 
#6

Re: Funktion erstellt gibt Objekt zurück, wer räumt auf

  Alt 17. Jul 2004, 14:12
Moin, moin,

irgendwie sehe ich keine echten Vorteil in der Verwendung einer Funktion
vor einer Procedureübergabe mit var. Zumal hier das Ergebnis ehedem nicht
gleich weiterverwendet wird (geschachtelte Funktionen).




Grüße // Martin
Martin Schaefer
  Mit Zitat antworten Zitat
Benutzerbild von Motzi
Motzi

Registriert seit: 6. Aug 2002
Ort: Wien
598 Beiträge
 
Delphi XE2 Professional
 
#7

Re: Funktion erstellt gibt Objekt zurück, wer räumt auf

  Alt 17. Jul 2004, 14:22
Kurze Anmerkung.. das
if Assigned(SL) then im Finally-Teil kann man sich sparen, da Free intern sowieso prüft ob der Self-Pointer nil ist...
Manuel Pöter
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.481 Beiträge
 
Delphi 10.1 Berlin Professional
 
#8

Re: Funktion erstellt gibt Objekt zurück, wer räumt auf

  Alt 17. Jul 2004, 15:28
Zitat von supermuckl:
Delphi-Quellcode:
var
  SL :TStringList;
begin
  try
    SL := foo();
  finally
    if Assigned(SL) then
      Freeandnil(SL);
  end;
end;
Und nun lass foo mal eine Exception auslösen. Das dein Assigned(SL) diesen Zustand abfängt steht bei 1:4 Mrd.
Die Muster für try/finally sind nämlich:
Delphi-Quellcode:
V := Type.Create;
try
  ...
finally
  V.Free;
end;
und
Delphi-Quellcode:
V := nil;
try
  V := Type.Create;
  ...
finally
  V.Free;
end;
Das V:=nil ist im zweiten Muster wichtig und der Compiler meldet das auch (aber es soll ja Leute geben, die Compiler Warnungen und Hinweise in den Wind schlagen, weil sie doch "unwichtig" sind).
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#9

Re: Funktion erstellt gibt Objekt zurück, wer räumt auf

  Alt 17. Jul 2004, 15:37
Hi Luckie,

wenn du es als "read" property eine Klasse machst, würde ich es so lösen (hatte selbst letztens einen ähnlichen Fall). Undzwar arbeitest du in der Klasse mit einer privaten Liste, die du aussenstehenden zugänglich machst.

Delphi-Quellcode:
TMyClass = class(TObject)
private
  FList: TStringList;
  function GetList: TStrings;
public
  property MyList: TStrings read GetList;
  constructor Create;
  destructor Destroy; override;
end;

// ...

constructor TMyClass.Create;
begin
  inherited;
  FList := TStringList.Create;
end;

destructor TMyClass.Destroy;
begin
  FreeAndNil(FList);
  inherited;
end;

function TMyClass.GetList: TStrings;
begin
  try
    // Mach was mit der FList...
    // ...
    Result := FList;
  except
    Result := nil;
  end;
end;
Ist ungetestet, sollte aber funktionieren.

mfG
mirage228
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  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 17:16 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