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..
- «Ostrożnie z c_str na obiekcie tymczasowym
- Ryzykowne słowo exception»
- ↑C++ - sztuczki i niebezpieczeństwa