Zauważyłem dziwną rzecz i przegrzebawszy dokumentację oraz zagraniczne fora, nie jestem w stanie znaleźć odpowiedzi. Chodzi o to, że TList mimo prawidłowego zwolnienia pamięci (próbowałem różnych sposobów), nie chce wrócić do bazowej wartości zajmowanej pamięci.
Na przykładzie. Kiedy kompiluję pustą aplikację z formą, zajmuje ona w pamięci dokładnie 1.7 MB. Tworzę sobie listę na bazie TList i zapełniam ją obojętnie czym:
type TCustomList = class(TList<Integer>);
var
CustomList: TCustomList;
Value: Integer;
CustomList:= TCustomList.Create;
Value:= 3;
for I:= 0 to 10000 do CustomClass.Add(Value);
Teraz całość oczywiście zajmuje trochę więcej w pamięci, np. 2.4 MB. Zwalniam to tak:
CustomList.Clear;
CustomList.Free;
Niby działa... ale nie zawsze. To znaczy tylko wtedy, gdy ilość zajmowanej pamięci przekroczy 3.5 MB. Czyli np. zamiast 10000, dodaję 100000 elementów, wtedy zajmowana pamięć wynosi np. 100 MB. Zwalniam, a ilość zajmowanej pamięci spada do 3.5 MB. Próbowałem ustawiać CustomList.Capacity:= 0, wypełniałem też listę klasami i wskaźnikami, które indywidualnie zwalniałem i nadal nic, poniżej 3.5 MB TList za nic zejść nie chce. Efekt się nie "stackuje", bo gdy zrobię, wypełnię i potem zwolnię kilka TCustomList, to finalnie i tak zawsze zostaje 3.5 MB. Jeżeli ilość zajmowanej pamięci nie przekroczy tej wartości (i np. będzie na poziomie 2.9), to pamięć też się nie zwolni (a przynajmniej tak to wygląda).
Niby nic, ale jednak chciałbym wiedzieć dlaczego tak to działa, bo jakieś to dla mnie dziwne.