Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Vector - problem ze zwalnianiem komórek w pamięci poprzez pop_back / clear / erase

Ostatnio zmodyfikowano 2016-07-25 21:46
Autor Wiadomość
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ń).

C/C++
#include <iostream>
#include <vector>
#include <conio.h>
using namespace std;

int main()
{
    int x = 0, ile;
    //DEKLARUJE ILE RAZY CHCE WPISAC CYFRE
    vector < int > tablica;
    cout << "Ile cyfr mam zapisac: ";
    cin >> ile;
    //PETLA INPUT > ZAPIS DO TABLICY
    for( int i = 0; i < ile; i++ )
    {
        x++;
        tablica.push_back( x );
    }
    //ROZMIAR VECTORA
    cout << "------------" << endl;
    cout << "Ilosc szufladek: " << tablica.size() << endl;
    cout << "------------" << endl;
    cout << "Dowolny klawisz" << endl;
    getch();
    //CZYSCZENIE (ZAPISALEM 3 ROZNE ZE WZGLEDU ZE ZADEN NIE DZIALA TAK JAK BYM SOBIE TEGO ZYCZYL)
    tablica.erase( tablica.begin() + 1 );
    tablica.pop_back();
    tablica.clear();
    //ROZMIAR PO CZYSZCZENIU
    cout << "------------" << endl;
    cout << "Ilosc szufladek: " << tablica.size() << endl;
    cout << "------------" << endl;
   
    //WYSWIETLENIE OSTATNIEGO ELEMMENTU KTOREGO NIE POWINNO BYC
    cout << "Ostatni element : " << tablica[ ile - 1 ];
   
    getch();
    return 0;
}
P-150224
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ć!!!
P-150225
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ć.
P-150228
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>.
P-150229
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.
P-150252
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.?
P-150253
« 1 »
  Strona 1 z 1