Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Dynamische Arrays freigeben (Delphi2010) (https://www.delphipraxis.net/148894-dynamische-arrays-freigeben-delphi2010.html)

kaju74 10. Mär 2010 13:16


Dynamische Arrays freigeben (Delphi2010)
 
Hallo.

Ich habe mal eine Frage zum Freigeben zuvor allokierten Speichers bzgl. dynamischen Arrays unter Delphi2010.

Gegeben sei folgender Konstrukt:

Delphi-Quellcode:
TNXXmlSearchResult = record
  private
    FElement: TNXXmlElement;
    FAttribute: TNXXmlAttribute;
    FIndex: Integer;
    function GetName: string;
  public
    function AsString(const Default: string = ''): string;
    function AsInteger(const Default: Integer = 0): Integer;
    function AsFloat(const Default: Extended = 0.00): Extended;
    property Attribute: TNXXmlAttribute read FAttribute write FAttribute;
    property Element: TNXXmlElement read FElement write FElement;
    property Name: string read GetName;
    property Index: Integer read FIndex;
  end;

  TNXXmlSearchResults = array of TNXXmlSearchResult;
Ferner gibt es eine Funkion (in NXXmlDocument) zum Suchen von einzelnen Xml-Elementen:

Delphi-Quellcode:
function Search(const XPath: string): TNXXmlSearchResults;
Diese Funktion hat in etwa folgenden Aufbau:

Delphi-Quellcode:
  ....Aufbau der Suchergebnisse in einer Liste (Hits)...

  SetLength(Result, Hits.Count);
  for i := 0 to Hits.Count - 1 do
    with PHitItem(Hits[i])^ do
    begin
      Result[i].Element := Element;
      Result[i].Attribute := Attribute;
      Result[i].FIndex := i;
    end;
Soweit so gut. Nun kann ich die Funktion ja wie folgt aufrufen:

Delphi-Quellcode:
var
  XmlResults: TNXXmlResults;
  SearchResult: TNXXmlSearchResult;
begin
  XmlResults := NXXmlDocument.Search('/books/*/records');
  try
    for SearchResult in XmlResults do
      { do anything with SearchResult... }
  finally
    XmlResult := nil;
  end;
end;
Laut Delphi Hilfe gibt man ein dynamisches Array frei, indem man diesem NIL zuweißt. Was aber passiert bei folgendem
Konstrukt, das man sehr häufig antrifft:

Delphi-Quellcode:
var
  SearchResult: TNXXmlSearchResult;
begin
  for SearchResult in NXXmlDocument.Search('/books/*/records') do
    { do anything with SearchResult... }
end;
Wie und wo und wird überhaupt der Speicher hier freigegeben?

Danke & Gruß,
- kaju

Blup 10. Mär 2010 14:30

Re: Dynamische Arrays freigeben (Delphi2010)
 
Der Compiler fügt automatisch Code für Array-, String- und Interface-Variable hinzu.
Am Anfang der Gültigkeit (hier der Prozedur) werden diese mit Nil bzw. Leer initialisiert und zum Schluss entsprechend freigegeben.
Lokale Variablen sind nur bis zum Ende der Prozedur gültig, die Zuweisung von Nil ist deshalb hier überflüssig.

kaju74 10. Mär 2010 14:51

Re: Dynamische Arrays freigeben (Delphi2010)
 
Hallo.

Danke...wieder wad gelernt...8-))) Bei "normalen" Variablen war mir das bewusst, bei dynamischen
Arrays aber nicht so.

Gruß,
- kaju


Alle Zeitangaben in WEZ +1. Es ist jetzt 01: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