Einzelnen Beitrag anzeigen

kaju74

Registriert seit: 22. Okt 2003
185 Beiträge
 
#1

Dynamische Arrays freigeben (Delphi2010)

  Alt 10. Mär 2010, 14:16
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:

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
  Mit Zitat antworten Zitat