Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi XML Objekte Freigeben (https://www.delphipraxis.net/93783-xml-objekte-freigeben.html)

SandStein 11. Jun 2007 12:02


XML Objekte Freigeben
 
Hallo.

Ich habe folgenden Code, der mir einen XML-String generieren soll:

Delphi-Quellcode:
function TGpn2Xml.getXML() : String;
var xml : TXMLDocument;
    node : IXMLNode;

begin
  xml := TXMLDocument.Create(nil);
  xml.Active := true;

  node := xml.AddChild('Wurzelelement');
  xml.DocumentElement := node;

  // Hier werden später noch mehr XML-Daten eingefügt

  result := xml.XML.GetText;
 
  FreeAndNil(xml); // ???

end;
Mein Problem ist die Zeile mit dem FreeAndNil. Hier kommt es zu einer Zugriffsverletzung.
Warum?
Was ist mit dem Interface node. Muss dieses auch freigegeben werden?

Besten Dank

SandStein

Elvis 11. Jun 2007 12:13

Re: XML Objekte Freigeben
 
Warum nimmst du kein IXmlDocument und vergisst Free() einfach?
Wenn du es wirklich so machen willst, dann solltest du node auf nil setzen, bevor du das Dokument freigibst.
Eine Interfacereferenz auf nil setzen ist das gleiche, als ob du die Methode verlässt: Der Referenzzähler wird um 1 reduziert.
Hättest du beide einfach als Interfaces müsstest du gar nix beachten. :zwinker:

SandStein 11. Jun 2007 12:50

Re: XML Objekte Freigeben
 
Besten Dank :thumb:

Statt ein Objekt zu erschaffen, benutze ich jetzt das Interface und weise ihm am Anfang

xml := newXMLDocument;

zu.

Mal wieder was dazugelernt.

Danke!

Tod787 4. Okt 2013 11:10

AW: XML Objekte Freigeben
 
Hallo ich habe ein ähnliches Problem. Ich verwende meinen XML-Aufruf in einer Unit.
Und wollte eigentlich die Instanz immer lokal erstellen und wieder freigeben, was ja bekanntlich nicht geht.
Da ich die Funtkion zyklisch aufrufe läuft mein Speicher voll.

Delphi-Quellcode:
function XMLLesen(PfadXML: String): Integer;
var
  Daten: IXMLWinCosJobType;
  XMLDoc : TXMLDocument;
begin
  try
    XMLDoc := TXMLDocument.Create(nil);
    XMLDoc.LoadFromFile(Pfad);
    Daten := GetWinCosJob(XMLDoc);
  finally
    XMLDoc .Free // geht bekanntlich nicht
  end;
Die Lösung

Zitat:

Statt ein Objekt zu erschaffen, benutze ich jetzt das Interface und weise ihm am Anfang

xml := newXMLDocument;
habe ich allerdings nicht ganz verstanden.

Was ist damit gemeint?

Der schöne Günther 4. Okt 2013 11:39

AW: XML Objekte Freigeben
 
Genau was dort steht:

Deine Zeile
Delphi-Quellcode:
XMLDoc := TXMLDocument.Create(nil);
wird zu
Delphi-Quellcode:
XMLDoc := NewXMLDocument();
Und den Try-Block mitsamt seinem finally und
Delphi-Quellcode:
XmlDoc.Free()
entfernst du. Fertig.

Wenn die Methode verlassen wird, wird deine
Delphi-Quellcode:
IXMLDocument
-Instanz automatisch freigegeben.

Tod787 4. Okt 2013 13:26

AW: XML Objekte Freigeben
 
Vielen Dank!!! Stand auf dem Schlauch :)


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