Οδηγός Μελέτης - Εισαγωγή στον Προγραμματισμό

Α25.1 · Καθαρή διαχείριση μνήμης

Εργαστήριο 9, Άσκηση 5 · Δυσκολία ★★☆ · programming · Κεφάλαια: 25, 21, 22

Η άσκηση βασίζεται στο παράρτημα «Αποσφαλμάτωση προγραμμάτων (Πράξη 5η)» του εργαστηρίου, που δείχνει πώς τρέχουμε ένα πρόγραμμα κάτω από το valgrind:

gcc -g3 -o grades grades.c
valgrind --leak-check=full ./grades

και πώς διαβάζουμε τις κατηγορίες διαρροών (definitely lost, indirectly lost, possibly lost, still reachable). Η μόνη έξοδος που θεωρούμε καθαρή είναι:

==2578== HEAP SUMMARY:
==2578==     in use at exit: 0 bytes in 0 blocks
==2578==   total heap usage: 5 allocs, 5 frees, 4,160 bytes allocated
==2578==
==2578== All heap blocks were freed -- no leaks are possible
==2578==
==2578== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)

5.1 Καθαρίστε τις δομές σας.

Επιστρέψτε στις Ασκήσεις 3 και 4 αυτού του εργαστηρίου. Καμία από τις δύο δεν αποδεσμεύει τη μνήμη που δεσμεύει.

5.1.1 Γράψτε τη συνάρτηση void free_list(Listptr ptr) και καλέστε την από τη main του grades.c. Επιβεβαιώστε με valgrind ότι βλέπετε το μήνυμα All heap blocks were freed.

5.1.2 Γράψτε την αναδρομική συνάρτηση void free_tree(Treeptr p) για το tree.c. Προσοχή στη σειρά: πρέπει να αποδεσμεύσετε πρώτα τα υποδένδρα και μετά τον κόμβο. Τι θα δείξει το valgrind αν το κάνετε ανάποδα;

5.2 Ξαναδείτε ένα παλιό σφάλμα.

Στο εργαστήριο 8 αποσφαλματώσαμε το wages.c με τη βοήθεια ενός debugger. Τρέξτε τώρα την αρχική, λανθασμένη έκδοση του με valgrind. Ποιο ακριβώς μήνυμα σας δίνει, και σε ποια γραμμή; Σας οδηγεί πιο γρήγορα στο πρόβλημα από ό,τι ο gdb;

Υπόδειξη

Στη λίστα, κρατήστε τον δείκτη στον επόμενο κόμβο πριν αποδεσμεύσετε τον τρέχοντα, αλλιώς διαβάζετε μνήμη που μόλις ελευθερώσατε. Στο δένδρο, η σειρά είναι μια post-order διάσχιση: αν ελευθερώσετε πρώτα τον κόμβο, τα left και right του διαβάζονται από αποδεσμευμένη μνήμη.

Αριθμός στον οδηγό: Α25.1 (στο κεφάλαιο) · Μόνιμο αναγνωριστικό: lab-lab09-grades-tree · Σύνδεσμος: https://progintro.github.io/study/questions/labs/lab-lab09-grades-tree.html · Markdown (GitHub)