ΗΥ - 150...

Click here to load reader

  • date post

    12-Jan-2016
  • Category

    Documents

  • view

    53
  • download

    0

Embed Size (px)

description

ΗΥ - 150 Προγραμματισμός. Δυναμική Διαχείριση Μνήμης (1/2). Δυναμική Διαχείριση Μνήμης. Μέχρι τώρα στατική ανάθεση και δέσμευση μνήμης Ζητούσαμε στο π ρόγραμμά μας τη μέγιστη μνήμη π ου μ π ορεί να χρειαζόμασταν #define MAX_SIZE 10000 int array[MAX_SIZE]; - PowerPoint PPT Presentation

Transcript of ΗΥ - 150...

ΗΥ-150 ΠρογραμματισμςΜχρι τρα στατικ ανθεση και δσμευση μνμης
Ζητοσαμε στο πργραμμ μας τη μγιστη μνμη που μπορε να χρειαζμασταν
#define MAX_SIZE 10000
int array[MAX_SIZE];
Μειονκτημα : Υπρχουν εφαρμογς που το MAX_SIZE εναι γνωστο οπτε αναγκαζμαστε να δηλνουμε μεγλες τιμς και να χνουμε και σε μνμη και σε ταχτητα
Δυναμικ κατανομ μνμης (dynamic memory allocation)
Ατηση απ το λειτουργικ να μας παραχωρσει μνμη
Ειδοποηση στο λειτουργικ τι δεν χρειαζμαστε πια να μρος μνμης
,τι δεσμεετε πρπει να αποδεσμεετε
HY150 - Προγραμματισμς
ΗΥ150 – Προγραμματισμς
Ξενοφν Ζαμπολης
Μνμη αποθκευσης του κδικα του προγρμματος
Μνμη αποθκευσης των μεταβλητν ενς προγρμματος που δεσμεονται με στατικ αυτματη διαχεριση μνμης
Αυτ η μνμη ονομζεται στοβα (stack)
Μνμη αποθκευσης των μεταβλητν ενς προγρμματος που δεσμεονται με δυναμικ διαχεριση μνμης
Αυτ η μνμη ονομζεται σωρς (heap)
HY150 - Προγραμματισμς
ΗΥ150 – Προγραμματισμς
Ξενοφν Ζαμπολης
void *malloc( size_t numBytes);
Δεσμεει numBytes αριθμ απ διαδοχικ Bytes και επιστρφει να δεκτη στην αρχ της δεσμευμνης θση μνμης
Επιστρφει NULL αν δεν μπορε να δεσμεσει λλη μνμη
 
HY150 - Προγραμματισμς
ΗΥ150 – Προγραμματισμς
Ξενοφν Ζαμπολης
void *calloc(size_t nelements, size_t bytes);
Δεσμεει nelements αριθμ απ διαδοχικ αντικεμενα το καθνα μεγθους bytes και επιστρφει να δεκτη στην αρχ της δεσμευμνης θση μνμης
Επιστρφει NULL αν δεν μπορε να δεσμεσει λλη μνμη
Αρχικοποιε τα περιεχμενα της δεσμευμνης μνμης στο 0
Παρμοια με την malloc
Διαφορ 2: αρχικοποηση των περιεχομνων με 0
int *ptr = (int *) calloc (100, sizeof(int));
HY150 - Προγραμματισμς
ΗΥ150 – Προγραμματισμς
Ξενοφν Ζαμπολης
void free(void *pointer);
Αποδεσμεει τη μνμη που χει δεσμευτε με μα απ τις προηγομενες κλσεις στην malloc, calloc realloc
Δεν πρπει να αποδεσμεουμε πνω απ μια φορ την δια μνμη
ptr = (int *)malloc (100*sizeof(int));
free(ptr); // Αυτ εναι οκ μχρι εδ
free(ptr); // Αποδεσμεουμε την δια μνμη
// δυο φορς! ΛΑΘΟΣ
Επκταση μνμης
Ο δεκτης *ptr πρπει να δεχνει σε μνμη δη δεσμευμνη με την malloc calloc
ptr = (int *)malloc (100*sizeof(int));
Επαναδσμευση μνμης με λλο μγεθος
ptr = (int *)realloc(ptr, 200*sizeof(int));
Τα προηγομενα περιεχμενα της δεσμευμνης μνμης διατηρονται (τουλχιστον σα χωρον στην καινοργια)
Η καινοργια μνμη μπορε να εναι σε λλη διεθυνση αν δεν υπρχε αρκετ μεγλο συνεχμενο block απ ελεθερη μνμη για δσμευση. Σε αυτν την περπτωση γνεται μεταφορ των δεδομνων και αποδεσμεεται η μνμη ptr, σαν να γνεται δηλαδ μια free(ptr)
HY150 - Προγραμματισμς
ΗΥ150 – Προγραμματισμς
Ξενοφν Ζαμπολης
Γενικς δεκτης
Κατ την εκτλεση του προγρμματος αποφασζετε ο τπος του (char *, int *, float *, double *, struct my_struct *, …)
Ο γενικς δεκτης μας δνει τη δυναττητα να ορζουμε συναρτσεις που μας επιστρφουμε χρο στη μνμη χωρς να μας ενδιαφρει ο τπος! Π.χ. malloc
ΠΡΟΣΟΧΗ: σε συναρτσεις εναι τελεως διαφορετικ
1. void f() // η συνρτηση ΔΕΝ επιστρφει τποτα
2. void *f() //επιστρφει να δεκτη που ο προγραμματιστς πρπει να //αποσαφηνσει τον τπο του μσα στην συνρτηση
HY150 - Προγραμματισμς
ΗΥ150 – Προγραμματισμς
Ξενοφν Ζαμπολης
Δυναμικο Πνακες
Πνακες που το μγεθος τους καθορζεται κατ την εκτλεση του προγρμματος ( σε run-time).
Δυναττητα προσαρμογς στις εκστοτε απαιτσεις χωρς ανγκη περιορισμο.
int *x = (int *)malloc( 10 * sizeof(int));
x
Πρπει να γνεται πντα λεγχος επιστροφς της απαρατητης μνμης !!
Εναι ευθνη του προγραμματιστ και στοιχεο σωστο προγραμματισμο!
Οι συναρτσεις δυναμικς δσμευσης επιστρφουν NULL ταν αποτυγχνουν, το οποο μπορομε να εξετσουμε και να διακψουμε την εκτλεση του προγρμματος αν χρειζεται
int *p = (int *)malloc(10000*sizeof(int));
if (p == NULL)
exit(0);
Απελευθρωση
Πρπει να ελευθερνουμε την μνμη ταν δεν την χρειαζμαστε (με την free)
Δεν ελευθερνουμε ποτ μνμη που δεν χει αποκτηθε δυναμικ (λ.χ. με malloc)
Αν δεν ελευθερσουμε λη τη μνμη που δεσμεουμε αυτ ονομζεται διαρρο μνμης (memory leak)
Η διαρρο μνμης μπορε να οδηγσει σε καταστσεις που δεν υπρχει λλη ελεθερη μνμη
Προχωρημνο: ταν τελεινει η ελεθερη μνμη του υπολογιστ, ττε το λειτουργικ στλνει κποια μνμη στον δσκο, ελευθερνει τσι μνμη και την ξανα-χρησιμοποιε. Ξαναφρνει απ τον δσκο στη μνμη ταν γνεται πρσβαση σε αυτν. Αυτ οδηγε στο φαινμενο trashing που γρφεται και διαβζεται απ το δσκο συνχεια μνμη. Με διαρρο μνμης να πργραμμα μπορε να αρχσει να κνει thrashing μετ απ ρες, μρες, χρνια συνεχς λειτουργας του.
Λση : Αποδεσμεουμε αμσως τη μνμη που δεν χρησιμοποιομε (χρση της free)
HY150 - Προγραμματισμς
ΗΥ150 – Προγραμματισμς
Ξενοφν Ζαμπολης
Πρβλημα 3:
Παρμοια αποτελσματα ταν χρησιμοποιομε μη δεσμευμνη μνμη
Αλλζουμε μεταβλητς που χρησιμοποιομε χωρς να το ξρουμε – δσκολα ανιχνεεται
Πμε να γρψουμε σε μνμη που δεν μας ανκει (segmentation fault) και το πργραμμα διακπτεται αυτματα
HY150 - Προγραμματισμς
ΗΥ150 – Προγραμματισμς
Ξενοφν Ζαμπολης
Πρβλημα 4:
Μπορε να μπερδψει το λειτουργικ στην διαχεριση ελεθερης μνμης
HY150 - Προγραμματισμς
ΗΥ150 – Προγραμματισμς
Ξενοφν Ζαμπολης
char ch; char *pch; char **ppch; char ***ppch;
Δεκτης σε πνακα απ δεκτες (γνωστο στην αρχ και το μγεθος του πνακα και το μγεθος των περιοχν που δεχνουν οι δεκτες)
HY150 - Προγραμματισμς
ΗΥ150 – Προγραμματισμς
Ξενοφν Ζαμπολης
int lines = 5; /* Both lines and cols could be evaluated */
int cols = 10; /* or read in at run time */
int i, **Α;
exit(0);
{
if (Α[i] == NULL)
exit(0);
printf("\n%d %p %d", i, Α[i], Α[i]);
if (i > 0) printf(" %d",(int)(Α[i] - Α[i-1]));
}
free (Α[i]);
A[1][0] ...
A[3][0] ...
HY150 - Προγραμματισμς
ΗΥ150 – Προγραμματισμς
Ξενοφν Ζαμπολης
exit(0);
{
if (Α[i] == NULL)
exit(0);
printf("\n%d %p %d", i, Α[i], Α[i]);
if (i > 0) printf(" %d",(int)(Α[i] - Α[i-1]));
}
free (Α[i]);
Αλλ χι:
int a[10][20];
Δσμευση μνμης: 10×20 ακραιοι
Υπολογισμς διεθυνσης του a[r][c]: r*20+c+αρχ του πνακα
int **b;
Δσμευση μνμης για b:10 δεκτες b = (int **)malloc (10*sizeof(int*))
Δσμευση μνμης για b[i]: 20 ακραιοι σε κθε γραμμ
for (i = 0; i < 10; i++)
b[i] = (int *) malloc(20 * sizeof(int));
Υπολογισμς διεθυνσης του b[r][c]: διεθυνση μνμης του δεκτη b[r] + c
ΠΡΙΝ ΤΟΝ ΥΠΟΛΟΓΙΣΜΟ ΤΟΥ b[r][c] πρπει να χει γνει σωστ ανθεση τιμν στα b[r] και δσμευση μνμης.
HY150 - Προγραμματισμς
ΗΥ150 – Προγραμματισμς
Ξενοφν Ζαμπολης
πως χουμε πει:
Και η δισταση θα καθοριστε σε a[4]
Επσης:

Παρμοια αλλ χι τα δια!!!
Το πρτο καθορζει ναν πνακα χαρακτρων (11) που μπορε να αλλαχθε:
aLine[4] = ‘T’; /* Σωστ! */
Το δετερο καθορζει ναν δεκτη προς μα σταθερ τπου string που δεν μπορε να αλλαχθε:
pLine[4] = ‘T’; /* ΛΑΘΟΣ!! */
χι μνο δεκτες σε δεκτες αλλ και πνακες απ δεκτες!
char *name[ ] = {“Illegal”, “Jan”, ”Feb”, ”Mar”, ”Apr”, ”May”, “Jun”, “Jul”, “Aug”, “Sep”, “Oct”, “Nov”, “Dec”};
Π.χ. name[2] εναι νας δεκτης στο character string ‘F’, ‘e’, ‘b’, ‘\0’
Γιατ θα θλαμε ναν πνακα απ δεκτες;
HY150 - Προγραμματισμς
ΗΥ150 – Προγραμματισμς
Ξενοφν Ζαμπολης
Smith, David
Leahy, Bill
Dagon, David
Humperdinck, Englebert
Υποθστε πως θλουμε να τα ταξινομσουμε αλφαβητικ αλλ παρατηρομε πως εναι διαφορετικο μεγθους.
Αντ να χρησιμοποισουμε ναν αλγριθμο ταξινμησης που αλλζει character strings around γιατ να μην χρησιμοποισουμε ναν πνακα απ δεκτες και να αλλζουμε δεκτες;
πολ πιο γργορο
Leahy, Bill
Smith, David
Dagon, David
Humperdinck, Englebert
name[0]
name[1]
name[3]
name[2]
HY150 - Προγραμματισμς
ΗΥ150 – Προγραμματισμς
Ξενοφν Ζαμπολης