@Neutral General: Das mein PAnsiString nicht initialisiert ist oder auf Müll zeigt, würde ich jetzt erstmal für mich ausschließen da das besagte Problem nur sporadisch auftritt und nicht so einfach zu greifen ist.
Ich denke schon die ganze Zeit nach, ob es nicht wirklich "einfach" nur an der Fragementierung liegt.
Habe jetzt mal folgendes getestet:
Delphi-Quellcode:
var
i: Integer;
a: AnsiString;
begin
try
i := 1;
while True do
begin
SetLength(a, i);
i := i * 2;
end;
except
//DoAnything...
end;
end.
Hier ist laut TaskManager ganz eindeutig zu sehen, dass der Speicher anwächst.
Jetzt eine kleine Änderung und man sieht im TaskManager den Speicher nicht mehr ansteigen...
Delphi-Quellcode:
var
i: Integer;
a: AnsiString;
begin
try
i := 1;
while True do
begin
SetLength(a, 0); //<---- NEU
SetLength(a, i);
i := i * 2;
end;
except
//DoAnything...
end;
end.
Habe mir grade mal ein Programm geschrieben, was mir permanent über MessageQueue Nachrichten an einen Thread schickt mit der Übergabe eines PAnsiString und anschließender Freigabe. Ich teste das ganze jetzt mal nur mit dem SetLength (also ohne vorher das "SetLength(xxx,0)" und gucke mir das mal im TaskManager an.
Ein Timer schickt alle 1,5 sek ein Telegramm an den Thread und dieser macht mit dem Telegramm erstmal gar nichts. Ist für mich nur zum testen...
Habt ihr noch Ideen / Anreize / Vorschläge?
Viele Grüße
Alex