MSXML



  • Hallo!

    Ich habe ein MSXML-Dokument erzeugt, mittels IXMLDOMDocumentPtr (also Smartpointer).

    Ist es möglich, dieses Dokument ohne große Umstände vollständig aus dem Speicher zu entfernen ohne daß ich jeden Knoten einzeln entfernen muß?

    Wäre auf Anregungen dankbar!!!

    Grüsse



  • Sollte verschwinden sobald Du die letzte referenz losläßt.



  • Nun, nachdem ich ein Dokument geladen habe, kann es sein, daß ich im gleichen Scope das Dokument verwerfen will und ein anderes laden möchte.

    Also, ich beginne damit, ein ein XML-Dokument zu laden
    --> Das XML-Dokument ist als DOMDocument im Speicher (sagen wird 1 MB).

    Dann allerdings will ich (in der gleichen Funktion (Scope)) dieses Dokument verwefen, weil ich ein neues laden will.
    --> Ich release den IXMLDOMDocumentPtr, und lade das nächste XML-Dokument. (das 1 MB verbleibt jedoch im Speicher)

    Problem: In den IXMLDOMDocumentPtr kann zwar ein neues Dokument geladen werden, das alte allerdings hängt noch im Speicher rum. DAS SIEHT MAN IM TASKMANGER IN DER SPEICHERAUSLASTUNG --> Die entläßt das alte Dokument (mit all seinen IXMLDOMNodePtr)

    GIBT ES EINE FUNKTION, DIE EIN GESAMTES DOMDOCUMENT AUS DEM SPEICHER RÄUMT (mit IXMLDOMDocumentPtr::Release wird nur das Dokument gelöscht, nicht aber die erzeugten KindElemente)



  • Mach immer schön Release für alle Interfacepointer, und alles ist gut. Noch besser, benutz Smartpointer wie CComPtr.



  • Ich habe mein Projekt schon mit IXMLDOM____Ptr aufgabaut (gibts da irgendwelche bekannten Schwierigkeiten?)

    Nun, da wird mir wohl nichts anderes übrig bleiben, jeden Knoten einzeln zu löschen ... hmmm (ES GIBT TATSÄCHLICH KEINE VORGEFERTIGTE FUNKTION, DIE AUF EINEN SCHLAG ALLES ENTFERNT???) 😞



  • PCi schrieb:

    ES GIBT TATSÄCHLICH KEINE VORGEFERTIGTE FUNKTION, DIE AUF EINEN SCHLAG ALLES ENTFERNT???) 😞

    Schrei nicht so, und beschränk dich auf einzelne Satzzeichen!

    Grad mal nachgeschaut: Die IXMLDOM*Ptr-Objekte sind bereits Smartpointer. Eigentlich sollte also alles aufgeräumt werden.



  • *flüster* pardon! *flüster*

    Das Smartpointer nach verlassen des Scopes aufgeräumt werden, ist mir klar!!! (ups) 😉

    Jedoch, ich verlasse den SCOPE (pardon!!!! ... oh pardon! 😋 ) eben nicht! Wenn ich ein neues XML-Dokument laden will und IXMLDOMDocumentPtr release, dann sind alle Smartpointers nach wie vor im Speicher (und genau die will ich los werden ... am besten mit einer IXMLDOMDocument-Funktion, wenns die gibt).

    Also: Ich will nicht nur ein DOMDocument entfernen (das geht ja einfach mit Release()), sondern auch alle dazugehörigen Nodes (IXMLDOMNodPtr ... also Smartpointer), GLEICHGÜLTIG OB ICH DEN SCOPE VERLASSEN HABE ODER NICHT

    PS: Wenn ich in großen Lettern schreibe, dann will ich damit nicht Lautstärke ausdrücken, sondern den Satz als besonders wichtig damit hervorheben. Bitte ned gleich so schnell eingeschnappt sein 🙂



  • Den Dokument-Smartpointer und alle Smartpointer auf Nodes die du noch hast (sollten ja eh nicht so viele sein) NULL setzen.



  • Was mich nachdenklich stimmt ist, daß wenn ich ein Dokument lade, im Taskmanager dementsprechend ein Speicherverbrauch angezeigt wird. Hingegen, wenn ich das Dokument release, reduziert sich der Speicherverbrauch nicht.

    Wie kann das sein?



  • Wenn der C++-Heap nicht ausreicht, fordert dieLaufzeitumgebung Speicher vom System an, der wird allerdings nicht sofort ans System zurückgegeben, bloß weil du ihn freigibst.

    Wenn du mistrauisch bist: Boundschecker o.ä., oder du legst dein "laden, freigeben" einfach in eine Schleifeund siehst dir den Speicehrbedarf an.


Anmelden zum Antworten