Úloha 7.6
Majme nasledujúci program:
void runMe(){
int* leakingPtr = (int*) malloc(sizeof(int) * 1024);
for(int i=0; i < 1024; i++){
leakingPtr[i] = i + 1000;
}
}
int main(){
runMe();
return 0;
}- Ako vyzerá alokovaná pamäť program pred a po volaní funkcie
runMe? - Čo je zlé s funkciou
runMe? (minimálne 2 veci) - Prepíšte program tak aby bol korektný.
Rozbaľ pre ukážku riešenia
Problémy s funkciou
Únik pamäte:
- Alokovaná pamäť pomocou malloc nie je uvoľnená pred ukončením funkcie. Tým sa stráca možnosť k nej pristúpiť, čo vedie k úniku pamäte.
Žiadna kontrola úspešnosti alokácie:
- Funkcia malloc môže zlyhať a vrátiť NULL. Program toto nezohľadňuje, čo môže spôsobiť segfault alebo nepredvídateľné správanie, ak sa pamäť pokúsi použiť.
Opravy
#include <stdio.h>
#include <stdlib.h>
void runMe() {
// Alokácia pamäte
int* leakingPtr = (int*) malloc(sizeof(int) * 1024);
if (leakingPtr == NULL) {
printf("Nepodarilo sa alokovať pamäť.\n");
return;
}
// Naplnenie pamäte hodnotami
for (int i = 0; i < 1024; i++) {
leakingPtr[i] = i + 1000;
}
// Použitie alokovaných hodnôt (napr. výpis prvých niekoľkých hodnôt)
for (int i = 0; i < 5; i++) {
printf("Value at index %d: %d\n", i, leakingPtr[i]);
}
// Uvoľnenie pamäte
free(leakingPtr);
}
int main() {
runMe();
return 0;
}Uvoľnenie pamäte:
- Pridané volanie free(leakingPtr) pred ukončením funkcie runMe zabezpečí, že alokovaná pamäť nebude ponechaná na heap.
Kontrola úspešnosti malloc:
- Pred použitím pointera leakingPtr sa kontroluje, či alokácia bola úspešná (leakingPtr != NULL).
Príklad výstupu
Value at index 0: 1000
Value at index 1: 1001
Value at index 2: 1002
Value at index 3: 1003
Value at index 4: 1004