Zitat von
shmia:
Delphi-Quellcode:
// falsch:
// Interface-Zeiger werden als var-Parameter übergeben
procedure TMyType.CopyForms(var p_Param1 : IMyComType; var p_Param2 : IMyComType2; var p_Param3 : TStringList);
// richtig:
// Interface-Zeiger werden by Value übergeben
// auch Delphi-Objekte werden by Value übergeben
procedure TMyType.CopyForms(p_Param1 : IMyComType; p_Param2 : IMyComType2; p_Param3 : TStringList);
Danke für die (knappe?) Antwort. Leider ändert das nichts an meinem Verhalten/Problem.
Will sagen:
- Funktioniert wie gehabt
- Leakt wie gehabt (laut MemProof halt genau in dieser Funktion und zwar eine Unmenge an Strings..)
Ich hab die Funktion "komprimiert" in:
Delphi-Quellcode:
procedure TMyType.CopyForms(p_Param1 : IMyComType; p_Param2 : IMyComType2; p_Param3 : TStringList);
var
vFormNames : Variant;
begin
try // try-finally
vFormNames := VarArrayFromStrings(p_Param3);
p_Param1.CopyForms(p_Param2, PSafeArray(TVarData(vFormNames).VArray), False);
finally
Finalize(vFormNames);
vFormNames := Unassigned;
end;
end;
Vorher war es die Zeile:
FormNames[iNameIndex] := p_Param3[iNameIndex];
Jetzt ist es:
vFormNames := VarArrayFromStrings(p_Param3);
Der Stacktrace des Leaks ist über diesen Zeilen:
Zitat:
system.pas - WStrFromPWCharLen
variants.pas - VarFromWStr
meineUnit - DieZeileVonOben
Danke im voraus für jede Hilfe,
Ben