24.02.2014 Aufrufe

4 in 1 - Medieninformatik - Hochschule RheinMain

4 in 1 - Medieninformatik - Hochschule RheinMain

4 in 1 - Medieninformatik - Hochschule RheinMain

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!