Προγραμματισμός

* Γνώση Υπολογιστών >> Προγραμματισμός >> C /C + + Προγραμματισμός

Πώς να αποτρέψει διαρροές μνήμης σε C + +

A διαρροή μνήμης είναι ένα είδος bug προγραμματισμού που παρουσιάζεται όταν ένα πρόγραμμα διαθέτει περισσότερη μνήμη από όσο απελευθερώνει . Με αυτό τον τρόπο , μια εφαρμογή μπορεί να τρέξει έξω από τη μνήμη και να προκαλέσει το σύστημα να καταρρεύσει . Για την αποφυγή διαρροών μνήμης , θα πρέπει να γνωρίζετε όταν συμβαίνουν συχνότερα και να είναι ευσυνείδητοι με τη χρήση του "νέου" και "διαγραφή" C + + φορείς . Τα πράγματα που θα χρειαστείτε
Proficiency σε C + +
C + + compiler
Debugger και άλλες ερευνητικές εργαλεία λογισμικού

Παρουσίαση Περισσότερες οδηγίες
Η 1

κατανοείτε τις βασικές έννοιες του χειριστή. Η C + + φορέα " νέα " διαθέτει μνήμη σωρού. Η " delete " χειριστής ελευθερώνει μνήμη σωρού . Για κάθε « νέο », θα πρέπει να χρησιμοποιήσετε ένα "διαγραφή" , έτσι ώστε να απελευθερωθεί η ίδια μνήμη σας χορηγηθεί : .
Char * str = new char [ 30 ] ? //Διαθέστε 30 bytes για να στεγάσει μια σειρά
delete [ ] str ? //Clear αυτά τα 30 bytes και κάνουν το σημείο str πουθενά
εικόνων 2

Ανακατανομή μνήμη μόνο αν έχετε διαγράψει . . Στον παρακάτω κώδικα , str αποκτά μια νέα διεύθυνση με τη δεύτερη κατανομή . Η πρώτη διεύθυνση έχει χαθεί ανεπανόρθωτα , και έτσι είναι τα 30 bytes που επεσήμανε . Τώρα είναι αδύνατο να δωρεάν , και έχετε μια διαρροή μνήμης : .
Char * str = new char [ 30 ] ? //Str Δώστε μια διεύθυνση μνήμης
//delete [ ] str ? //Αφαιρέστε το πρώτο σχόλιο σήμανση σε αυτή τη γραμμή για να διορθώσει
str = new char [ 60] ? . . //Δώστε str άλλη διεύθυνση μνήμης με το πρώτο φύγει για πάντα
delete [ ] str ? //Αυτό διαγράφει το 60 bytes , και όχι μόνο τα πρώτα 30 .

Η 3

Παρακολουθήστε τις αναθέσεις δείκτη . Κάθε δυναμική μεταβλητή ( μνήμη κατανέμεται στο σωρό ) πρέπει να συνδέεται με ένα δείκτη . Όταν μια δυναμική μεταβλητή γίνεται διαχωριστεί από το δείκτη του ( α ) , καθίσταται αδύνατο να σβήσει . Και πάλι , αυτό οδηγεί σε διαρροή μνήμης :
char * str1 = νέα char [ 30 ] ?
Char * str2 = νέα char [ 40 ] ?
Strcpy ( str1 , " απώλεια μνήμης " ) ?
str2 = str1 ? //Bad ! Τώρα τα 40 bytes είναι αδύνατο να διαγράψετε δωρεάν
[ ] str2 ? . //Αυτό διαγράφει τα 30 bytes
delete [ ] str1 ? . Παραβίαση //Πιθανή πρόσβαση . Τι συμφορά !
Εικόνων 4

Να είστε προσεκτικοί με τους τοπικούς δείκτες . Ένας δείκτης που δηλώνετε σε λειτουργία διατίθεται στη στοίβα , αλλά η δυναμική μεταβλητή που δείχνει να διατίθεται στο σωρό . Εάν δεν τη διαγράψετε , θα εξακολουθούν να υφίστανται μετά τις εξόδους του προγράμματος από τη λειτουργία :
άκυρη διαρροής ( int x ) {
char * p = new char [ x ] ?
//delete [ ] p? //Αφαιρέστε το πρώτο σχόλιο σήμανση για να διορθώσει
}
εικόνων 5

Δώστε προσοχή στις αγκύλες μετά . "διαγραφή ". Χρησιμοποιήστε "διαγραφή" από μόνη της να απελευθερώσει ένα ενιαίο αντικείμενο . Χρησιμοποιήστε το " delete" [ ] με αγκύλες για να απελευθερώσει μια σειρά σωρό . Μην κάνετε κάτι σαν αυτό :
char * = ένα νέο char ?
Delete [ ] ένα? //Λάθος
char * = πολλά νέα χαρακτηριστικά [ 30 ] ?
Διαγράψετε πολλά ? ! //Λάθος
εικόνων
εικόνων

Συναφής σύστασή

Πνευματικά δικαιώματα © Γνώση Υπολογιστών Όλα τα δικαιώματα κατοχυρωμένα