Korte samenvatting

  • De meest voornamelijke manier van het opslaan van geheugen is het plaatsen van geheugen op de stack. Dit is eigenlijk een hele grote stapel, waar het door jou geplaatste geheugen op wordt gegooid.
    • Geheugen op de stack wordt gealloceerd en verwijderd (als de data out-of-scope is) door de computer zelf. Hier word je als programmeur dus niet mee belast.
  • Een andere manier van geheugenopslag is de opslag van geheugen op de heap. Dit geheugen wordt ook wel dynamic memory genoemd. Het meest voornamelijke verschil t.o.v de opslag van geheugen op de stack, is dat de programmeur zelf handmatig het geheugen moet plaatsen en verwijderen.
    • Bij dynamic memory werk je met pointers. Dit zijn variabelen die een geheugenadres vasthouden: het adres van een stukje opgeslagen data op de heap.

Risico’s stack & heap

De opslag van geheugen op de stack en heap komt niet zonder risico’s:

  • Heap: het komt vaak voor dat er wel geheugen op de heap wordt geplaatst, maar niet meer wordt verwijderd. Als dynamic memory out-of-scope raakt, is het niet meer te benaderen en dus ook niet meer te verwijderen. Met andere woorden: er blijft altijd onnodig een stukje geheugen op de heap geplaatst staan. Dit staat bekend als memory leak.
  • Stack: als je een recursieve functie in je programma gebruikt (een functie die zichzelf aanroept) kan het voorkomen dat er zoveel geheugen op de stack wordt geplaatst dat het programma crasht. De stack kan namelijk niet een oneindige hoeveelheid geheugen vasthouden. Dit noemt men ook wel stack overflow. Dit komt vooral voor bij functies die zichzelf extreem vaak/oneindig aanroepen. Een recursion cap, die meet hoe vaak een functie zichzelf heeft aangeroepen en ervoor zorgt dat dit na een aantal ‘cycles’ stopt, voorkomt stack overflow.

Broncode

Voorbeeld opslag geheugen op de stack

#include <iostream>
#include <string>

using namespace std;

int main(int argc, const char * argv[])
{
	int array[10] = { 1, 2, 3 };
	
	float floatVoorbeeld = 8.0f;

	string stringVoorbeeld = "Hello, World!";
}

Voorbeeld opslag geheugen op de stack

#include <iostream>
#include <string>

using namespace std;

int main(int argc, const char * argv[])
{
	int* pointerVoorbeeld = new int;

	*pointerVoorbeeld = 8;

	cout << *pointerVoorbeeld << endl;

	delete pointerVoorbeeld;
}