Leider ist es so, dass tatsächlich Embarcadero den Fehler (das Memory-Leak) verursacht.
Das Problem ist der folgende Code in der Funktion TSOAPDomConv.ConvertSOAPToObject aus
Soap.OPToSOAPDomConv.pas ab Zeile 4768:
Delphi-Quellcode:
function TSOAPDomConv.ConvertSOAPToObject(RootNode, Node: IXMLNode; AClass: TClass;
const URI, TypeName: InvString; ObjP: Pointer): TObject;
// ...
if Assigned(Obj)
and LegalRef
then
begin
if (NodeClass <>
nil)
and (NodeClass <> Obj.ClassType)
then
Obj.Free();
// Dieses Free hat gefehlt, die alte Instanz von Obj dangled nach dem Überschreiben
Obj := NodeClass.Create;
end
// ...
Ist auch in der aktuellen Delphi Version (Tokyo) noch vorhanden. Vermutlich gibt es auch noch weitere Stellen die ein ähnliches Problem haben.
TObject ist nun mal nicht ref-counted
Ich werde ein Ticket bei Embarcadero aufmachen.
Gruss,
Günther