Συνιστάται, 2024

Επιλογή Συντάκτη

Διαφορά μεταξύ νέων και malloc ()

Τα νέα και malloc () χρησιμοποιούνται και για τη δυναμική κατανομή της μνήμης. Αν και τα νέα και το malloc () είναι διαφορετικά σε πολλά πλαίσια. Η κύρια διαφορά μεταξύ του νέου και του malloc () είναι ότι ο νέος είναι ο χειριστής, ο οποίος χρησιμοποιείται ως κατασκεύασμα. Από την άλλη πλευρά, το malloc () είναι μια τυπική λειτουργία βιβλιοθήκης, που χρησιμοποιείται για την κατανομή μνήμης κατά το χρόνο εκτέλεσης. Οι άλλες διαφορές μεταξύ τους εξετάζονται παρακάτω στο διάγραμμα σύγκρισης:

Συγκριτικό διάγραμμα

Βάση σύγκρισηςνέοςmalloc ()
ΓλώσσαΟ νέος χειριστής είναι ένα συγκεκριμένο χαρακτηριστικό των C ++, Java και C #.Η συνάρτηση malloc () είναι χαρακτηριστικό του C.
Φύση"νέο" είναι χειριστής.Το malloc () είναι μια συνάρτηση.
μέγεθος του( )το νέο δεν χρειάζεται το μέγεθος του φορέα εκμετάλλευσης, καθώς κατανέμει αρκετή μνήμη για συγκεκριμένο τύποτο malloc απαιτεί από τον χειριστή sizeof να γνωρίζει ποιο μέγεθος μνήμης πρέπει να κατανείμει.
ΚατασκευαστήςΟ νέος χειριστής μπορεί να καλέσει τον κατασκευαστή ενός αντικειμένου.το malloc () δεν μπορεί να κάνει κλήση σε έναν κατασκευαστή.
ΑρχικοποίησηΟ νέος χειριστής θα μπορούσε να αρχικοποιήσει ένα αντικείμενο κατά την κατανομή της μνήμης σε αυτό.Δεν ήταν δυνατή η προετοιμασία μνήμης στο malloc.
ΥπερφόρτωσηΟ νέος χειριστής μπορεί να υπερφορτωθεί.Το malloc () δεν μπορεί ποτέ να υπερφορτωθεί.
ΑποτυχίαΣε περίπτωση αποτυχίας, ο χειριστής νέος ρίχνει μια εξαίρεση.Σε περίπτωση αποτυχίας, το malloc () επιστρέφει ένα NULL.
ΔιαγραφήΗ κατανομή μνήμης από νέα, ανακατευθυνόμενη με τη χρήση "delete".Η κατανομή μνήμης από το malloc () απομετράται χρησιμοποιώντας μια λειτουργία free ().
ΑνακατανομήΟ νέος χειριστής δεν ανακατανέμει τη μνήμη.Η μνήμη που διατίθεται από το malloc () μπορεί να ανακατανεμηθεί χρησιμοποιώντας το realloc ().
ΕκτέλεσηΟ νέος χειριστής κόβει τον χρόνο εκτέλεσης.Το malloc () απαιτεί περισσότερο χρόνο εκτέλεσης.

Ορισμός νέων

Ο νέος χειριστής είναι ένας χειριστής κατανομής μνήμης που διαθέτει μνήμη δυναμικά. Ο νέος τελεστής εκχωρεί τη μνήμη στο σωρό και επιστρέφει την αρχική διεύθυνση αυτής της μνήμης, η οποία έχει εκχωρηθεί σε μια μεταβλητή αναφοράς. Ο νέος χειριστής είναι παρόμοιος με τον malloc () στο C. Ωστόσο, ο συντάκτης C ++ είναι συμβατός με το malloc (), αλλά είναι καλύτερο να χρησιμοποιήσετε νέο χειριστή, καθώς έχει ορισμένα πλεονεκτήματα σε σχέση με το malloc (). Η σύνταξη του νέου χειριστή έχει ως εξής:

 πληκτρολογήστε variable_name = νέος τύπος (λίστα παραμέτρων). 

Εδώ, ο "type" δηλώνει τον τύπο δεδομένων της μεταβλητής για την οποία πρέπει να διατεθεί η μνήμη. Η λέξη "variable_name" είναι το όνομα που δίνεται στη μεταβλητή αναφοράς που κρατά το δείκτη στη μνήμη. Η παρένθεση εδώ καθορίζει την κλήση του κατασκευαστή. Ο κατάλογος παραμέτρων είναι η λίστα των τιμών που μεταβιβάζονται στον κατασκευαστή για την αρχικοποίηση του πρόσφατα κατασκευασμένου αντικειμένου.

Ο νέος χειριστής διαθέτει αρκετή μνήμη που απαιτείται για ένα αντικείμενο συγκεκριμένου τύπου. Επομένως, δεν απαιτεί operator sizeof () ούτε χρειάζεται να αλλάξει το μέγεθος της μνήμης όπως το malloc () που χρησιμοποιεί το realloc () για να ανακατανείμει τη μνήμη. Ο νέος χειριστής είναι ένα κατασκεύασμα. ονομάζει τον κατασκευαστή ενός αντικειμένου ενώ η δήλωση χρησιμοποιείται γενικά για την αρχικοποίηση του αντικειμένου.

Γνωρίζουμε ότι ο νέος χειριστής διαθέτει τη μνήμη στο σωρό και το μέγεθος του σωρού είναι περιορισμένο. Έτσι, εάν ο σωρός είναι εκτός λειτουργίας και ο νέος χειριστής προσπαθεί να διαθέσει τη μνήμη, θα οδηγήσει σε αποτυχία του νέου χειριστή. Εάν ο νέος χειριστής αποτύχει να διαθέσει τη μνήμη, θα κάνει μια εξαίρεση και αν ο κωδικός σας δεν είναι σε θέση να χειριστεί αυτήν την εξαίρεση, το πρόγραμμα τερματίζεται ασυνήθιστα.

Η μνήμη που έχει εκχωρηθεί από τον νέο χειριστή μπορεί να ελευθερωθεί χρησιμοποιώντας τον χειριστή διαγραφής. Ο νέος χειριστής διακόπτει τον χρόνο εκτέλεσης καθώς είναι χειριστής και όχι λειτουργία.

Ορισμός του malloc ()

Το malloc () είναι μια συνάρτηση που χρησιμοποιείται για την κατανομή της ζητούμενης ποσότητας μνήμης στον σωρό. Η μέθοδος επιστρέφει τον δείκτη του τύπου "void" ο οποίος είναι περαιτέρω, πληκτρολογήστε cast για να πάρετε έναν δείκτη σε μια μνήμη συγκεκριμένου τύπου και αυτός ο δείκτης στη μνήμη αντιστοιχεί σε μια μεταβλητή αναφοράς. Η συνάρτηση malloc () είναι παρόμοια με τον νέο χειριστή στη C ++, καθώς χρησιμοποιείται για δυναμική μνήμη. Το malloc () είναι μια τυπική λειτουργία βιβλιοθήκης. Η σύνταξη της λειτουργίας malloc () έχει ως εξής:

 πληκτρολογήστε variable_name = (type *) malloc (sizeof (type)); 

Εδώ, ο "τύπος" υποδεικνύει τον τύπο δεδομένων της μεταβλητής για την οποία πρέπει να κατανεμηθεί η μνήμη. Το variable_name είναι το όνομα της μεταβλητής αναφοράς στο οποίο θα αποδοθεί ο δείκτης που επιστρέφεται από malloc (). Ο (τύπος *) περιγράφει τη χύτευση τύπου για να αποκτήσει έναν δείκτη στη μνήμη σε συγκεκριμένο τύπο. Το μέγεθοςof () περιγράφει το malloc (), τι μέγεθος μνήμης απαιτείται.

Το malloc () απαιτεί χύτευση τύπου επειδή ο δείκτης που επιστρέφεται από το malloc () είναι άκυρου τύπου, έτσι ώστε να εκχωρηθεί ένας τύπος στον δείκτη, απαιτείται χύτευση τύπου. Το μέγεθοςof () απαιτείται επειδή η συνάρτηση malloc () διαθέτει μια ακατέργαστη μνήμη ως εκ τούτου, είναι απαραίτητο να πει τη λειτουργία malloc () τι μέγεθος μνήμης πρέπει να διαθέσει. Εάν η κατανεμημένη μνήμη δεν είναι επαρκής, μπορεί να γίνει αλλαγή μεγέθους ή ανακατανομή χρησιμοποιώντας το realloc ().

Η συνάρτηση malloc () κατανέμει τη μνήμη στον σωρό. Σε περίπτωση που ο σωρός είναι εκτός μνήμης τότε η συνάρτηση malloc () επιστρέφει έναν δείκτη NULL. Επομένως, η μεταβλητή αναφοράς που περιέχει δείκτη που επιστρέφεται από το malloc (), θα πρέπει να ελέγχεται πριν χρησιμοποιηθεί, διαφορετικά μπορεί να οδηγήσει σε συντριβή συστήματος.

Η μνήμη που εκχωρείται από τη συνάρτηση malloc () απομετράται με τη χρήση free (). Καθώς η κλήση της συνάρτησης οδηγεί σε γενικά έξοδα, το malloc () απαιτεί περισσότερο χρόνο εκτέλεσης.

Βασικές διαφορές μεταξύ νέων και malloc ()

  1. Ο νέος χειριστής είναι μια κατασκευή που έχει εισαχθεί στην C ++ και χρησιμοποιείται σε Java, C #, κλπ. Από την άλλη πλευρά, το malloc () είναι μια συνήθης λειτουργία βιβλιοθήκης που βρίσκεται μόνο στη γλώσσα C και υποστηρίζεται από τη C ++.
  2. Ο νέος χειριστής διαθέτει αρκετή μνήμη για το αντικείμενο συγκεκριμένου τύπου, οπότε δεν απαιτείται χειρισμός μεγέθους. Από την άλλη πλευρά, η συνάρτηση malloc () απαιτεί από τον χειριστή sizeof () να αφήσει τη συνάρτηση να γνωρίζει τι μέγεθος μνήμης πρέπει να διαθέσει.
  3. Ο νέος χειριστής μπορεί να καλέσει τον κατασκευαστή του αντικειμένου κατά τη δήλωση. Από την άλλη πλευρά, η λειτουργία malloc () δεν μπορεί να καλέσει τον κατασκευαστή.
  4. Ο χειριστής «νέος» θα μπορούσε να υπερφορτωθεί, αλλά το malloc () δεν θα μπορούσε.
  5. Εάν ο νέος χειριστής αποτύχει να διαθέσει τη μνήμη, πετάει μια εξαίρεση που πρέπει να αντιμετωπιστεί από τον κώδικα αλλιώς το πρόγραμμα θα τερματιστεί. Από την άλλη πλευρά, η συνάρτηση malloc () επιστρέφει έναν δείκτη NULL αν αποτύχει να διαθέσει μνήμη. Εάν ο δείκτης χρησιμοποιείται χωρίς να το ελέγξετε αυτό, θα έχει ως αποτέλεσμα συντριβή συστήματος.
  6. Η μνήμη που διατίθεται με τη χρήση ενός νέου χειριστή μπορεί να ανακατευθυνθεί χρησιμοποιώντας τη λειτουργία "delete". Από την άλλη πλευρά, η μνήμη που κατανέμεται χρησιμοποιώντας τη λειτουργία malloc () μπορεί να απομεταλλωθεί με τη χρήση free ().
  7. Αφού μοιραστεί η μνήμη χρησιμοποιώντας έναν νέο χειριστή, δεν μπορεί να αλλάξει το μέγεθός του ούτως ή άλλως. Από την άλλη πλευρά, η μνήμη που διατίθεται χρησιμοποιώντας τη λειτουργία malloc () μπορεί να ανακατανεμηθεί (αλλαγή μεγέθους) χρησιμοποιώντας τη λειτουργία realloc ().
  8. Ο χρόνος εκτέλεσης του νέου είναι μικρότερος σε σύγκριση με το malloc () επειδή το malloc είναι μια συνάρτηση και το νέο είναι ένα κατασκεύασμα.

Συμπέρασμα:

Η συνάρτηση malloc () είναι ο παλιός τρόπος για δυναμική κατανομή της μνήμης. Σήμερα, ο νέος χειριστής χρησιμοποιείται για την κατανομή της μνήμης κατά το χρόνο εκτέλεσης επειδή έχει ορισμένα πλεονεκτήματα έναντι του malloc ().

Top