Udostępnij za pośrednictwem


Zarządzanie pamięcią: alokacja ramek

Alokacja na ramce przyjmuje nazwę z "ramki stosu", która jest konfigurowana za każdym razem, gdy wywoływana jest funkcja. Ramka stosu to obszar pamięci, który tymczasowo przechowuje argumenty funkcji, a także wszystkie zmienne zdefiniowane lokalnie dla funkcji. Zmienne ramki są często nazywane zmiennymi "automatycznymi", ponieważ kompilator automatycznie przydziela im miejsce.

Istnieją dwie kluczowe cechy alokacji ramek. Najpierw podczas definiowania zmiennej lokalnej na ramce stosu jest przydzielana wystarczająca ilość miejsca do przechowywania całej zmiennej, nawet jeśli jest to duża tablica lub struktura danych. Po drugie zmienne ramki są automatycznie usuwane, gdy wykraczają poza zakres:

void MyFunction()
{
   // Local object created on the stack
   CString strName;
   // Object goes out of scope and is deleted as function ends
}

W przypadku zmiennych funkcji lokalnych przejście zakresu odbywa się, gdy funkcja kończy działanie, ale zakres zmiennej ramki może być mniejszy niż funkcja, jeśli są używane zagnieżdżone nawiasy klamrowe. To automatyczne usuwanie zmiennych ramek jest bardzo ważne. W przypadku prostych typów pierwotnych (takich jak int lub bajtów), tablic lub struktur danych automatyczne usuwanie po prostu odzyskuje pamięć używaną przez zmienną. Ponieważ zmienna wyszła poza zakres, nie można jej mimo to uzyskać dostępu. Jednak w przypadku obiektów języka C++ proces automatycznego usuwania jest nieco bardziej skomplikowany.

Gdy obiekt jest definiowany jako zmienna ramowa, jego konstruktor jest wywoływany automatycznie w momencie napotkania definicji. Gdy obiekt wykracza poza zakres, jego destruktor jest wywoływany automatycznie przed odzyskaniem pamięci dla obiektu. Ta automatyczna konstrukcja i niszczenie mogą być bardzo przydatne, ale należy pamiętać o automatycznych wywołaniach, zwłaszcza do destruktora.

Kluczową zaletą przydzielania obiektów na ramce jest to, że są one automatycznie usuwane. Podczas przydzielania obiektów na ramce nie trzeba martwić się o zapomniane obiekty powodujące przecieki pamięci. (Aby uzyskać szczegółowe informacje na temat przecieków pamięci, zobacz artykuł Wykrywanie przecieków pamięci w MFC). Wadą alokacji ramek jest to, że zmienne ramki nie mogą być używane poza ich zakresem. Innym czynnikiem podczas wybierania alokacji ramek w porównaniu z alokacją sterty jest to, że w przypadku dużych struktur i obiektów często lepiej używać sterty zamiast stosu dla magazynu, ponieważ przestrzeń stosu jest często ograniczona.

Zobacz też

Zarządzanie pamięcią