Delphi scheint Objekte vorher zu zerstören

8

Ich arbeite an einem Delphi-Wrapper für die Google-API mit Delphi XE2. Ich habe alle Klassen mithilfe des XML-Datenbindungs-Assistenten generiert. Dies ist viel einfacher zu erklären mit Code, also hier ist die Funktion, die mein Test aufruft.

%Vor%

Nun, an dem Punkt, an dem 'end' angeklickt wird, hat Result.ChildNodes eine Adresse im Speicher und zählt 20. IXMLEntryTypeList ist eine Child-Schnittstelle von IXMLNodeCollection.

Jetzt ist hier mein Test:

%Vor%

Bei der zweiten if-Anweisung bekomme ich eine Zugriffsverletzung mit dem Hinweis "Zugriffsverletzung bei Adresse 0061A55C im Modul 'GoogleDocsApiTests.exe'. Leseadresse 00000049" und wenn ich meine Uhren nach ReturnValue und ReturnValue.ChildNodes ansehe, sehe ich dass ReturnValue die gleiche Adresse wie Result in der TGoogleDocsApi.GetEntries-Methode hat, aber mir die Zugriffsverletzung für die Rückgabewerte von ReturnValue.ChildNodes und in der TGoogleDocsApi.GetEntires-Methode die Eigenschaft Result.ChildNodes mit einer gültigen Adresse und dessen Eigenschaften zugewiesen wird aus.

Für mich sieht es so aus, als ob Delphi die ChildNodes -Eigenschaft irgendwo entlang der Linie freigibt, aber das macht für mich keinen Sinn, da ReturnValue immer noch darauf verweisen sollte, was (denke ich) es behalten sollte.

Irgendwelche Ideen, was passieren könnte?

    
nick 21.05.2012, 21:29
quelle

1 Antwort

21

Sie rufen TXMLDocument.Create mit einem Owner von nil an. Das bedeutet, dass seine Lebensdauer über die Referenzzählung der Schnittstelle gesteuert wird. Damit dies funktioniert, müssen Sie tatsächlich Schnittstellen verwenden. Ändere den Typ von xmlDoc in IXMLDocument , um eine Referenz zu pflegen, oder sonst etwas in der VCL wird es freigeben, wenn du es nicht erwartest.

    
hvd 21.05.2012, 21:54
quelle

Tags und Links