τα στοιχεία επικοινωνίας μου
Ταχυδρομείο[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Γνωρίζουμε ότι το delete χρησιμοποιείται για την απελευθέρωση ενός δυναμικού χώρου και το delete[] χρησιμοποιείται για την απελευθέρωση πολλών δυναμικών χώρων, αλλά ποια προβλήματα θα προκύψουν εάν τα αναμίξουμε; Έχω διαβάσει πολλά άρθρα στο ιστολόγιο, αλλά δεν είναι ικανοποιητικά, έτσι έγραψα αυτό το άρθρο για να σας ενημερώσω τι είναι και γιατί (Επιφανειακή εξήγηση, διορθώστε με)。
---------------------------------------------------------------------------------------------------------------------------------
Μπορούμε να δούμε πρώτα ένα παράδειγμα:
Το αποτέλεσμα τρεξίματος είναι:
Αλλά αν δεν γράψουμε ρητά τον καταστροφέα:
Το αποτέλεσμα είναι η κανονική λειτουργία:
---------------------------------------------------------------------------------------------------------------------------------
Γιατί;
Αν σας ρωτήσω πόσο χώρο εκχωρεί το σύστημα σε αυτά τα 10 αντικείμενα Κατηγορίας Α, τότε πιθανότατα θα απαντήσετε 40 byte.Είναι εύκολο να το καταλάβετε ένα Α είναι 4 byte και το 10 είναι 40 byte. .Αλλά στην πραγματικότητα, εάν γράψετε τον καταστροφέα μόνοι σας, θα εκχωρηθούν συνολικά 44 byte, εάν δεν γράψετε έναν καταστροφέα, θα εκχωρηθούν συνολικά 40 byte.。
Γιατί υπάρχουν 4 επιπλέον byte μετά την εγγραφή του καταστροφέα; Γνωρίζουμε ότι μετά τη χρήση του delete για την απελευθέρωση αυτού του χώρου, ο καταστροφέας θα κληθεί αυτόματα (http://t.csdnimg.cn/f2FOj), (1) Εάν γράψουμε τον καταστροφέα μόνοι μας, το delete πρέπει να το καλέσει (Στην πραγματικότητα, η διαγραφή είναι επίσης μια συνάρτηση, η οποία ισοδυναμεί με μια ένθετη κλήση της συνάρτησης.), τότε πόσες φορές καλείται είναι μια ερώτηση. Αυτά τα τέσσερα byte έχουν ακριβώς το μέγεθος ενός ακέραιου αριθμού. που ονομάζεται.Ωστόσο, πρέπει να γνωρίζετε ότι ο δείκτης p εξακολουθεί να δείχνει προς το πρώτο αντικείμενο, αλλά θα προχωρήσει για να πάρει τον αριθμό των αντικειμένων κατά την κατασκευή και την καταστροφή., η συγκεκριμένη σχέση έχει ως εξής:
(2) Εάν δεν γράψουμε έναν καταστροφέα αυτήν τη στιγμή, θα καλέσει τον καταστροφέα που δημιουργήθηκε από τον μεταγλωττιστή χωρίς να καταγράψει τον αριθμό των φορών (μπορεί να περιλαμβάνει ένα χαμηλότερο επίπεδο, δεν είμαι σίγουρος γι 'αυτό, παρακαλώ διορθώστε με) και δεν χρειάζεται να ανοίξετε επιπλέον πλαστική χειρουργική.
Εντάξει, τώρα μπορούμε να εξηγήσουμε το παραπάνω παράδειγμα
Το Delete απελευθερώνει χώρο από τη θέση που δείχνει ο δείκτης από προεπιλογή, το delete[] ελέγχει πρώτα αν ανοίγει περισσότερος χώρος από προεπιλογή και, αν ναι, μετακινεί τον δείκτη προς τα εμπρός μία θέση πριν τον απελευθερώσει. Εάν ανοίξετε περισσότερο χώρο ή χρησιμοποιήσετε το delete για να ελευθερώσετε το χώρο, τότε ο ανοιχτός χώρος δεν μπορεί να απελευθερωθεί, προκαλώντας διαρροή μνήμης, επομένως αναφέρεται ένα σφάλμα.
Θα λάβω σφάλμα αν το εξασκήσω; :
Δεν χρειάζεται να καλέσετε τον καταστροφέα, δεν χρειάζεται να μετρήσετε τον αριθμό των αντικειμένων και δεν χρειάζεται να ανοίξετε περισσότερο χώρο, επομένως, ο χώρος μπορεί να απελευθερωθεί από τη θέση που δείχνει ο δείκτης, οπότε δεν θα υπάρχει σφάλμα έχουν αναφερθεί.
Υπάρχουν πολλές καταστάσεις, μπορείτε να κατεβείτε και να το δοκιμάσετε μόνοι σας.