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