4 in 1 - Medieninformatik - Hochschule RheinMain
4 in 1 - Medieninformatik - Hochschule RheinMain
4 in 1 - Medieninformatik - Hochschule RheinMain
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
Programmieren <strong>in</strong> C<br />
Freispeicherverwaltung<br />
Programmieren <strong>in</strong> C<br />
Freispeicherverwaltung<br />
Speicherlecks erkennen<br />
valgr<strong>in</strong>d Beispiellauf<br />
Speicherlecks Beispiel<br />
• Beispiel ähnlich<br />
• Lecks ohne Option -f<br />
Speicherlecks erkennen mit valgr<strong>in</strong>d<br />
• valgr<strong>in</strong>d, memory checker<br />
• Instrumentieren von vorhandenem<br />
Code<br />
• E<strong>in</strong>fach vor Programmaufruf<br />
valgr<strong>in</strong>d<br />
1 #<strong>in</strong>clude <br />
2 #<strong>in</strong>clude <br />
3 #<strong>in</strong>clude <br />
4<br />
5 <strong>in</strong>t ma<strong>in</strong>(<strong>in</strong>t argc, char *argv[]) {<br />
6 <strong>in</strong>t len = 10000, run=1, mallocs=0, i;<br />
7 <strong>in</strong>t *aptr;<br />
8 while(run && (mallocs < 1000)) {<br />
9 aptr = malloc(len*sizeof(<strong>in</strong>t));<br />
10 for (i=0; i 1 &&<br />
14 strcmp(argv[1], "-f") == 0)<br />
15 free(aptr);<br />
16 }<br />
17 return 0;<br />
18 }<br />
$ valgr<strong>in</strong>d ./leakval.exe<br />
==12615== Memcheck, a memory error detector<br />
==12615== HEAP SUMMARY:<br />
==12615== <strong>in</strong> use at exit: 40,000,000 bytes <strong>in</strong> 1,000 blocks<br />
==12615== total heap usage: 1,000 allocs, 0 frees, 40,000,000 bytes allocated<br />
==12615== LEAK SUMMARY:<br />
==12615== def<strong>in</strong>itely lost: 40,000,000 bytes <strong>in</strong> 1,000 blocks<br />
==12615== <strong>in</strong>directly lost: 0 bytes <strong>in</strong> 0 blocks<br />
==12615== possibly lost: 0 bytes <strong>in</strong> 0 blocks<br />
==12615== still reachable: 0 bytes <strong>in</strong> 0 blocks<br />
==12615== suppressed: 0 bytes <strong>in</strong> 0 blocks<br />
$ valgr<strong>in</strong>d ./leakval.exe -f<br />
==12618== Memcheck, a memory error detector<br />
==12618== HEAP SUMMARY:<br />
==12618== <strong>in</strong> use at exit: 0 bytes <strong>in</strong> 0 blocks<br />
==12618== total heap usage: 1,000 allocs, 1,000 frees, 40,000,000 bytes allocated<br />
==12618== All heap blocks were freed -- no leaks are possible<br />
Prof. Dr. Peter Barth (HS-Rhe<strong>in</strong>Ma<strong>in</strong>) Programmieren 3 29. Januar 2013 93 / 326<br />
Prof. Dr. Peter Barth (HS-Rhe<strong>in</strong>Ma<strong>in</strong>) Programmieren 3 29. Januar 2013 94 / 326<br />
Programmieren <strong>in</strong> C<br />
Freispeicherverwaltung<br />
Programmieren <strong>in</strong> C<br />
Freispeicherverwaltung<br />
Verkettete Liste – Header<br />
E<strong>in</strong>fach verkettete Liste<br />
• Zeiger auf Nachfolger<br />
• Wert ist Feld mit 80 Zeichen<br />
• Merken des Zeigers auf das erste Feld<br />
zur Repräsentation der Liste<br />
Hilfsrout<strong>in</strong>en<br />
• Liste anzeigen, show_list:<br />
Durchlaufen und Zeichenkette<br />
9<br />
10<br />
} slist;<br />
typedef slist *slptr;<br />
11<br />
ausgeben<br />
12 void show_list(slptr l);<br />
• Listenelement am Anfang e<strong>in</strong>fügen, 13 slptr <strong>in</strong>sert(slptr list, const char *s);<br />
<strong>in</strong>sert: Str<strong>in</strong>g mit max 80 Zeichen wird14 void delete_list(slptr list);<br />
kopiert<br />
15 slptr copy_list_reverse(slptr first);<br />
• Liste löschen, delete_list: Erstes<br />
Element schrittweise löschen<br />
• Kopieren, copy_list_reverse: Kopie<br />
hat umgekehrte Reihenfolge<br />
1 #ifndef SLIST_H<br />
2 #def<strong>in</strong>e SLIST_H<br />
3<br />
4 #def<strong>in</strong>e SMAXLEN 80<br />
5<br />
16<br />
6 typedef struct _slist {<br />
7 struct _slist *next;<br />
8 char s[SMAXLEN];<br />
17 #endif<br />
Prof. Dr. Peter Barth (HS-Rhe<strong>in</strong>Ma<strong>in</strong>) Programmieren 3 29. Januar 2013 95 / 326<br />
Verkettete Liste – Implementierung/1<br />
1 void show_list(slptr lis) {<br />
2 for (; lis; lis = lis->next)<br />
3 pr<strong>in</strong>tf("%s ", lis->s);<br />
4 pr<strong>in</strong>tf("\n");<br />
5 }<br />
6<br />
7 static void scopy(char *dest, const char *src) {<br />
8 strncpy(dest, src, SMAXLEN);<br />
9 dest[SMAXLEN-1] = 0;<br />
10 }<br />
11<br />
12 slptr <strong>in</strong>sert(slptr lis, const char *s) {<br />
13 slptr neu = malloc(sizeof(slist));<br />
14 if (neu == NULL)<br />
15 return NULL;<br />
16 scopy(neu->s, s);<br />
17 neu->next = lis;<br />
18 return neu;<br />
19 }<br />
Prof. Dr. Peter Barth (HS-Rhe<strong>in</strong>Ma<strong>in</strong>) Programmieren 3 29. Januar 2013 96 / 326