String i vector nie chcą oddać pamięci

Warto wiedzieć, że obiekty klasy string nigdy nie oddają otrzymanej pamięci. W szczególności, jeśli zmienna x zawierała kiedykolwiek napis długości 10.000 bajtów, to będzie trzymać 10.000 bajtów dopóki nie zostanie usunięta. W szczególności po wykonaniu następującego kodu:

   // s zawiera napis długości 10.000
   s = "";

s ma co prawda długość zero ale zaalokowaną pamięć (do sprawdzenia funkcją capacity) 10.000.

Jest tylko jeden (inny niż usunięcie zmiennej) sposób na zwolnienie tej pamięci:

   s.swap(string());

Powyższy kod tworzy tymczasowy pusty string, zamienia całą zawartość s z zawartością tej tymczasowej zmiennej (po tej operacji s wygląda jak nowo utworzony pusty string a to co w nim było należy do zmiennej tymczasowej) a następnie zwalnia zmienną tymczasową - dealokując przy okazji pamięć.

Analogiczny problem i analogiczny trick działa dla klas vector czy deque..

komentarze obsługiwane przez Disqus