stack frame (tsz. stack frames)
Egy Stack Frame minden egyes függvényhíváskor létrejön, és tartalmazza: - A függvény paramétereit (ha vannak). - A lokális változókat. - A visszatérési címet (hogy a függvény visszatérése után a program tudja, hová térjen vissza).
| Stack Frame (függvény 3) | | Stack Frame (függvény 2) | | Stack Frame (függvény 1) | | Stack Frame (main) | ----------------------------
Minden új függvényhíváskor egy új stack frame kerül a verem tetejére, és amikor a függvény visszatér, az adott stack frame törlődik.
#include <iostream>
using namespace std;
void fuggvenyB(int b) {
int x = b * 2; // Lokális változó
cout << "fuggvenyB, x = " << x << endl;
}
void fuggvenyA(int a) {
int y = a + 5; // Lokális változó
cout << "fuggvenyA, y = " << y << endl;
fuggvenyB(y); // Meghívja fuggvenyB()-t
}
int main() {
int z = 10; // Lokális változó
cout << "main, z = " << z << endl;
fuggvenyA(z); // Meghívja fuggvenyA()-t
return 0;
}
Ha ezt a programot lefuttatjuk, az alábbi stack frame-ek jönnek létre:
1️⃣ Amikor a main()
elindul:
| Stack Frame (main) | <-- `z` változó (értéke: 10) ----------------------------
2️⃣ Amikor fuggvenyA(z)
meghívódik:
| Stack Frame (fuggvenyA) | <-- `a = 10`, `y = 15` | Stack Frame (main) | ----------------------------
3️⃣ Amikor fuggvenyB(y)
meghívódik:
| Stack Frame (fuggvenyB) | <-- `b = 15`, `x = 30` | Stack Frame (fuggvenyA) | | Stack Frame (main) | ----------------------------
4️⃣ Amikor fuggvenyB
befejeződik, stack frame törlődik:
| Stack Frame (fuggvenyA) | | Stack Frame (main) | ----------------------------
5️⃣ Amikor fuggvenyA
befejeződik, stack frame törlődik:
| Stack Frame (main) | ----------------------------
6️⃣ Amikor main()
befejeződik, a teljes stack kiürül.
main, z = 10 fuggvenyA, y = 15 fuggvenyB, x = 30
A rekurzió során minden egyes rekurzív hívás új stack frame-et hoz létre, amely addig marad a stackben, amíg a függvény nem tér vissza.
void rekurzivFuggveny(int n) {
if (n == 0) return; // Kilépési feltétel
cout << "n = " << n << endl;
rekurzivFuggveny(n - 1); // Rekurzív hívás
}
int main() {
rekurzivFuggveny(5);
return 0;
}
rekurzivFuggveny(5)
)rekurzivFuggveny(5)
rekurzivFuggveny(4)
rekurzivFuggveny(3)
rekurzivFuggveny(2)
rekurzivFuggveny(1)
rekurzivFuggveny(0)
– innentől visszafele törlődnek a stack frame-ek.🔴 Probléma: Ha túl mély a rekurzió (n
túl nagy), stack overflow léphet fel!
✅ Megoldás: Mindig adjunk meg kilépési feltételt a rekurzióhoz, vagy használjunk iteratív megoldást.
Ha egy program túl sok stack frame-et hoz létre, stack overflow következhet be.
void vegtelenRekurzio() {
vegtelenRekurzio(); // Végtelen hívás
}
int main() {
vegtelenRekurzio(); // Stack overflow
return 0;
}
🔴 Hiba: Mivel nincs kilépési feltétel, a stack folyamatosan növekszik, amíg a memória el nem fogy.
✅ Megoldás: - Használj iterációt rekurzió helyett. - Használj heap memóriát nagy adatstruktúrákhoz. - Növeld a stack méretét operációs rendszer szinten (ha szükséges).
✅ A Stack Frame minden egyes függvényhíváskor létrejön és tartalmazza: - A függvény paramétereit. - A lokális változókat. - A visszatérési címet.
✅ A függvény visszatérésekor a stack frame automatikusan törlődik.
✅ A rekurzió esetén minden hívás új stack frame-et hoz létre.
🔴 Stack overflow léphet fel, ha túl sok stack frame jön létre, például végtelen rekurzió miatt.