Zwolenienie pamięci po użyćiu kontenera vector

0

Witam.
Uczę się C++ z książki Praty i mam pytanie dotyczące stosowania kontenera vector do tworzenia tablic dynamicznych, jako alternatywy dla mechanizmu New i Delete

Załóżmy że mam taki program (akurat tutaj jest jako funkcja):

void tablica(void) 
{

    int n;

    cout<<"Podaj, jak duza chcesz zrobic tablice wartosci typu int: "<<endl;
    cin>>n;

    vector<int> tab(n);

    cout<<"Tablica ma "<<n<<" elementow.\nZapelnij tablice wartosciami, a ja je wyswietle:\n"<<endl;

    int i1=0;
    while(i1<n)
    {
        cout<<"Element ["<<i1<<"] = ";
        cin>>tab[i1];
        cout<<endl;
        i1++;
    } i1=0;

    cout<<"\nPodales wszystkie wartosci. Teraz je wypisze:\n"<<endl;
    while(i1<n)
    {
        cout<<"Element ["<<i1<<"] = "<<tab[i1]<<endl;
        i1++;
    } i1=0;

    //jak zwolnic teraz pamiec?

}

Gdybym zamiast vector użył nst. instrukcji:

int * tab = new int [n]

to potem musiałbym zwolnić pamięć za pomocą

delete [] tab; 

A jak zwolnić pamięć, jeżeli użyję vectora?

I jeszcze jedno: mówiąc o vectorze używałem słowa "kontener na dane", a można też o tym mówić, że jest to klasa?

edit: czyżby slużyło do tego polecenie .clear()? np:

tab.clear();

2

A jak zwolnić pamięć, jeżeli użyję vectora?

std::vector sam zarządza zwalnianiem pamięci.

Gdybym zamiast vector użył nst. instrukcji:
int * tab = new int [n]
to potem musiałbym zwolnić pamięć za pomocą
delete [] tab;

new wymaga zwolnienia pamięci przez programistę.

https://dsp.krzaq.cc/post/176/ucze-sie-cxx-kiedy-uzywac-new-i-delete/

0
YooSy napisał(a):

std::vector sam zarządza zwalnianiem pamięci.
new wymaga zwolnienia pamięci przez programistę.

https://dsp.krzaq.cc/post/176/ucze-sie-cxx-kiedy-uzywac-new-i-delete/

No ok, ale skąd program wie, kiedy pamięć nie będzie już potrzebna? Przecież za jakiś czas w programie mogę potrzebować ponownie użyć tych danych?

3

} kończący zakres widzialności zmiennej powoduje jej usunięcie.

1

https://en.cppreference.com/w/cpp/container/vector

No ok, ale skąd program wie, kiedy pamięć nie będzie już potrzebna?

Zwalnia gdy jest potrzeba, a kontener w programie nie będzie już używany i oczywiście przy opuszczaniu scopa.

0
kq napisał(a):

} kończący zakres widzialności zmiennej powoduje jej usunięcie.

Dobra, to jeszcze tylko odpowiedzcie na moje drugie pytanie z pierwszego postu:

kario97 napisał(a):

I jeszcze jedno: mówiąc o vectorze używałem słowa "kontener na dane", a można też o tym mówić, że jest to klasa?

2
template<
    class T,
    class Allocator = std::allocator<T>
> class vector;

Co było w linku podesłanym z dokumetacji.
Tak. std::vector jest klasą, a dokładniej szablonem klasy.

2

clear() nie musi zwolnić pamięci
Można spróbować oprócz tego użyć: shrink_to_fit
ale to też nie musi zwolnić pamięci (taki urok C++).

Polecany trick do zwalniania pamięci to swap (taki WTF/idiom - C++ Coding Standards: 101 Rules, Guidelines, and Best Practices, pkt. # 82):

vector<int>().swap( tab );

1 użytkowników online, w tym zalogowanych: 0, gości: 1