Results 1 to 2 of 2

Thread: Netjes opruimen van componenten

  1. #1

    Netjes opruimen van componenten

    Hallo,

    Ik heb een routine voor het inlezen van XML (ergens op het internet gevonden)
    Voor het aanmaken van de XMLDoc gebruiken ze de volgende constructie
    Code:
     XMLDoc := TXMLDocument.Create(TComponent.Create(nil));
    .
    .
    .
    XMLDoc.free;
    Het nadeel hiervan is dat de TComponent niet wordt opgeruimd en er dus een memory leak ontstaat.
    Uiteraard kan ik dit oplossen door alles uit te schrijven
    Code:
    XMLComp := TComponent.Create(nil); 
    XMLDoc := TXMLDocument.Create(XMLComp);
    .
    .
    .
    XMLComp.Free;
    XMLDoc.free;
    De vraag is nu is er ook een manier waarbij ik dus geen aparte XMLComp aan hoef te maken maar dat deze ook netjes wordt opgeruimd

  2. #2
    Kan je niet gewoon `nil` meegeven i.p.v. XMLComp?

    Als XMLDoc van het type IXMLDocument is, (dus de interface), dan heb je daarin je referentie, en blijft het XML document bestaan tot de laatste reference naar de interface weg is. Je hoeft dan dus helemaal geen Free aan te roepen, en ook geen stub component te maken om maar een owner te hebben.

    Overigens, als je wél een owner component maakt, dan is die verantwoordelijk voor het vrijgeven. Je hoeft dan dus alleen XMLComp vrij te geven, en niet XMLDoc. Sterker nog, in de volgorde waarin je het doet in je tweede snippet, loop je kans op een access violation, aangezien XMLDoc ten tijde van de laatste regel een dangling pointer zal zijn naar het zojuist vrijgegeven XML Document.

    Zie ook TXMLDocument.Create voor een beschrijving van de verschillende manieren van life time management die TXMLDocument kent.
    Last edited by GolezTrol; 01-Sep-20 at 14:54.
    1+1=b

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •