Vector - problem ze zwalnianiem komórek w pamięci poprzez pop_back / clear / erase
Ostatnio zmodyfikowano 2016-07-25 21:46
Kakazoo Temat założony przez niniejszego użytkownika |
Vector - problem ze zwalnianiem komórek w pamięci poprzez pop_back / clear / erase » 2016-07-24 17:10:56 (Ostrzegam, że jestem początkującym programistą) Ostatnio napotkałem na bibliotekę vector, która umożliwia na łatwe i szybkie alokowanie pamięci. Stworzyłem pierwszy program korzystający z funkcji tej biblioteki i mam problem ze zwolnieniem pamięci. Kiedy zwalniam komórki w pamięci funkcja size() podaje mi prawidłową liczbę aktualnie zarezerwowanych komórek jednak przy próbie odczytu "usuniętej" komórki otrzymuję dane, które się w niej znajdowały, a po sprawdzeniu okazuje się, że pamięć nie została zwolniona (przez menedżer zadań). #include <iostream> #include <vector> #include <conio.h> using namespace std;
int main() { int x = 0, ile; vector < int > tablica; cout << "Ile cyfr mam zapisac: "; cin >> ile; for( int i = 0; i < ile; i++ ) { x++; tablica.push_back( x ); } cout << "------------" << endl; cout << "Ilosc szufladek: " << tablica.size() << endl; cout << "------------" << endl; cout << "Dowolny klawisz" << endl; getch(); tablica.erase( tablica.begin() + 1 ); tablica.pop_back(); tablica.clear(); cout << "------------" << endl; cout << "Ilosc szufladek: " << tablica.size() << endl; cout << "------------" << endl; cout << "Ostatni element : " << tablica[ ile - 1 ]; getch(); return 0; }
|
|
mateczek |
» 2016-07-24 17:30:38 a co Cie obchodzi zarządzanie pamięcią przez kontener ?? Kontenery są po to by ich używać!!!
|
|
Monika90 |
» 2016-07-24 20:12:23 pop_back, clear i erase nie zwalniają pamięci używanej przez wektor, ale niszczą usuwane obiekty, więc nie możesz się do tych nieistniejących obiektów odwoływać.
Jeżeli naprawdę musisz zwolnić tę pamięć, to wywołanie tablica.shrink_to_fit(); może (nie musi) ją zwolnić za cenę zmniejszenia wydajności programu. Raczej nie warto tego robić. |
|
j23 |
» 2016-07-24 20:18:16 @Kakazoo, nie każde usunięcie elementu z vectora oznacza realokację pamięci, to jeden z elementów optymalizacji. Formalnie ostatni element został usunięty, i próba dostępu do niego jest błędem. U Ciebie w przykładzie jest vector<int>, spróbuj ten sam numer z vector<string>. |
|
Kakazoo Temat założony przez niniejszego użytkownika |
» 2016-07-25 20:43:52 Faktycznie po próbie odczytu vectora typu string po wyczyszczeniu leci masa "losowych" liter i liczb po czym wywala błąd. Ciekawe dlaczego nie robi tego dla inta, ale cóż już widzę, że faktycznie się tego pozbyłem. |
|
Gibas11 |
» 2016-07-25 21:46:37 Vector sam nic nie robi ze stringiem, wywołuje destruktor i tyle. Co się dalej stanie z tą pamięcią to już nie twój interes. ;) A int to nie klasa tylko zlepek 4 bajtów, więc nie ma destruktora i o ile te 4 bajty dalej tam są to... są. Bo po co vector miałby to czyścić itd.? |
|
« 1 » |