8b. malloc, free, realloc
2021-02-28
slides.com/jod/pt_8b
Docent: Jo Devriendt
Assistent: Ann Philips
Coördinator: Joost Vennekens
voornaam.achternaam@kuleuven.be
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
malloc
#include <stdlib.h>
void main() {
float* x = (float*) malloc(sizeof(float));
*x = 3.14;
}
- Ken k bytes aan geheugen toe
- k hoeft niet op voorhand bekend te zijn
- Terugkeerwaarde is een pointer naar de geheugenlocatie
- NULL indien er iets fout liep
- void-pointer, dus casten naar het juiste type
8
x
adres:
?
?
?
?
?
?
?
?
3.14
?
?
?
?
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void* malloc(size_t k);
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
free
#include <stdlib.h>
void main() {
float* x = (float*) malloc(sizeof(float));
*x = 3.14;
free(x);
}
- Geef geheugen waar p naar point vrij
- Grootte van geheugen is opgeslagen in geheugen zelf :)
- Werkt enkel met pointer verkregen door malloc, realloc, of NULL
void free(void* p);
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
realloc
#include <stdlib.h>
void main() {
char* s = (char*) malloc(10);
strcpy(s, "Wikipedia");
s = (char*) realloc(s,14);
strcat(s, ".org");
free(s);
}
- Kopieer geheugen waar p naar verwijst naar nieuw geheugen met grootte k
- Verkleining als k kleiner is dan de huidige grootte, hoogste bytes worden niet gekopieerd
- Werkt enkel met pointer verkregen door malloc, realloc, of NULL
- p wordt meteen vrijgegeven
- NULL indien fout
void* realloc(void* p, size_t k);
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
Niet-elementaire datatypes
#include <stdlib.h>
typedef struct {
char naam[20];
int leeftijd;
} Mens;
void main() {
Mens* m = (Mens*) malloc(sizeof(Mens));
// ...
free(m);
}
Op dezelfde manier:
- malloc/realloc m.b.v. sizeof
- free om vrij te geven
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
Bug 1: Dangling pointer
#include <stdlib.h>
void main() {
char* s1 = (char*) malloc(10);
char* s2 = s1;
free(s1);
strcpy(s2, "Wikipedia");
}
Pointer die verwijst naar reeds vrijgegeven geheugen
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
Bug 2: Lost memory
#include <stdlib.h>
void main() {
char* s = (char*) malloc(10);
s = NULL;
// free(???);
}
Toegekend geheugen dat niet vrijgegeven is, maar waarvan het adres in geen enkele pointer meer gestockeerd is
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
Bug 3: Memory leak
#include <stdlib.h>
void main() {
char* s;
for(int i=0; i<99999999; ++i){
s = (char*) malloc(10);
}
free(s);
}
- Niet vrijgegeven geheugen dat zich opstapelt
- Vaak het gevolg van lost memory
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
Samenvatting
- malloc: reserveer stukje geheugen
- free: geef stukje geheugen terug
- realloc: combinatie van free en malloc op bestaand geheugen
- dangling pointer: pointer naar vrijgegeven geheugen
- lost memory: niet-vrijgegeven geheugen maar ontbrekende pointer
- memory leak: opeenstapeling van niet-vrijgegeven geheugen
Merk op: dit soort bugs komt niet voor bij stack-based geheugenallocatie
8b. malloc, free, realloc
By Jo Devriendt
8b. malloc, free, realloc
- 454