κατανοείτε τις βασικές έννοιες του χειριστή. Η 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 ] ?
Διαγράψετε πολλά ? ! //Λάθος
εικόνων
εικόνων
Πνευματικά δικαιώματα © Γνώση Υπολογιστών Όλα τα δικαιώματα κατοχυρωμένα