Πώς να εργαστείτε με δυναμική κατανομή μνήμης C ++;



Αυτό το άρθρο διερευνά τη δυναμική κατανομή μνήμης στο C ++ μια σημαντική δυνατότητα που σας επιτρέπει να λάβετε υπόψη τις ανάγκες μνήμης σας για πόρους σε πραγματικό χρόνο.

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

Ας ξεκινήσουμε λοιπόν με αυτό το άρθρο σχετικά με τη δυναμική κατανομή μνήμης στο C ++





Χρειάζεστε δυναμική κατανομή μνήμης;

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

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



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

Το C ++ ορίζει δύο unary τελεστές νέος και διαγράφω που εκτελούν το καθήκον εκχώρησης και αφαίρεσης της μνήμης κατά τη διάρκεια του χρόνου εκτέλεσης. Δεδομένου ότι αυτοί οι τελεστές (νέοι και διαγραφή) λειτουργούν με ελεύθερη μνήμη καταστήματος (Heap memory), καλούνται επίσης δωρεάν διαχειριστής καταστήματος. Οι δείκτες παρέχουν την απαραίτητη υποστήριξη για δυναμικό σύστημα κατανομής μνήμης στο C ++.

Με τη βοήθεια της δυναμικής κατανομής, ένα πρόγραμμα μπορεί να αποκτήσει μνήμη κατά τη διάρκεια του χρόνου εκτέλεσης.



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

Διαφορές μεταξύ κατανομής στατικής μνήμης και δυναμικής κατανομής μνήμης:

πώς να ορίσετε το classpath στην Ιάβα στα Windows 10

Αυτή είναι μια βασική αρχιτεκτονική μνήμης που χρησιμοποιείται για οποιοδήποτε πρόγραμμα C ++:

Μνήμη - Δυναμική κατανομή μνήμης - Edureka

Θα χρειαστούμε μια τέτοια εικόνα

Η στοίβα χρησιμοποιείται για εκχώρηση στατικής μνήμης και σωρός για δυναμική κατανομή μνήμης, και οι δύο αποθηκεύονται στη μνήμη RAM του υπολογιστή.

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

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

Προχωρώντας με αυτό το άρθρο σχετικά με τη δυναμική κατανομή μνήμης στο C ++

Κατανομή της μνήμης με χρήση νέος Λέξη-κλειδί

Στο C ++ το νέος Ο τελεστής χρησιμοποιείται για την εκχώρηση μνήμης κατά το χρόνο εκτέλεσης και η μνήμη κατανέμεται σε byte. ο νέος τελεστής δηλώνει ένα αίτημα για δυναμική κατανομή μνήμης στο Heap. Εάν υπάρχει επαρκής μνήμη, τότε το νέος Ο τελεστής αρχικοποιεί τη μνήμη και επιστρέφει τη διεύθυνση της πρόσφατα εκχωρημένης και αρχικοποιημένης μνήμης στη μεταβλητή δείκτη.

Σύνταξη:

τύπος δεδομένων * pointer_name = νέος τύπος δεδομένων

Παράδειγμα:

int * ptr = new int // Μπορούμε να δηλώσουμε μια μεταβλητή με δυναμική κατανομή με τους ακόλουθους δύο τρόπους. int * ptr = νέο int (10) int * ptr = νέο int {15} // ο νέος χειριστής χρησιμοποιείται επίσης για την εκχώρηση ενός μπλοκ (μια συστοιχία) μνήμης τύπου δεδομένων τύπου. int * ptr = new int [20] // Η παραπάνω δήλωση εκχωρεί δυναμικά μνήμη για 20 ακέραιους συνεχούς τύπου int και επιστρέφει ένα δείκτη στο πρώτο στοιχείο της ακολουθίας στο δείκτη «ptr».

Σημείωση : Εάν ο σωρός δεν έχει αρκετή μνήμη για εκχώρηση, το νέο αίτημα υποδεικνύει αποτυχία ρίχνοντας μια εξαίρεση std :: bad_alloc, εκτός εάν το 'nothrow' χρησιμοποιείται με το νέο χειριστή, οπότε επιστρέφει ένα δείκτη NULL. Επομένως, είναι καλή πρακτική να ελέγχετε για τη μεταβλητή δείκτη που παράγεται από νέα πριν τη χρησιμοποιήσετε στο πρόγραμμα.

Προχωρώντας με αυτό το άρθρο σχετικά με τη δυναμική κατανομή μνήμης στο C ++

Απενεργοποίηση της χρήσης μνήμης διαγράφω Λέξη-κλειδί:

Μόλις η σωστή μνήμη εκχωρείται σε μια μεταβλητή ή αντικείμενο κλάσης χρησιμοποιώντας το νέος λέξη-κλειδί, μπορούμε να αφαιρέσουμε τον χώρο μνήμης χρησιμοποιώντας το διαγράφω λέξη-κλειδί.

Σύνταξη:

.trim () java
delete pointer_variable // Εδώ, pointer_variable είναι ο δείκτης που δείχνει το αντικείμενο δεδομένων που δημιουργήθηκε από νέο. delete [] pointer_variable // Για να ελευθερώσουμε τη δυναμικά εκχωρημένη μνήμη πίνακα που δείχνει η μεταβλητή δείκτη χρησιμοποιούμε την ακόλουθη μορφή διαγραφής:

Παράδειγμα:

διαγραφή ptr διαγραφή [] ptr

Σημείωση : Η έκταση του αντικειμένου ή η διάρκεια ζωής του αντικειμένου είναι ο χρόνος για τον οποίο το αντικείμενο παραμένει στη μνήμη κατά την εκτέλεση του προγράμματος. Η κατανομή μνήμης σωρού είναι πιο αργή από μια στοίβα, καθώς, στο σωρό, δεν υπάρχει συγκεκριμένη σειρά με την οποία μπορείτε να εκχωρήσετε μνήμη, ενώ στη στοίβα ακολουθεί το LIFO.

Προχωρώντας με αυτό το άρθρο σχετικά με τη δυναμική κατανομή μνήμης στο C ++

Πίνακες δυναμικής κατανομής

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

Ας δούμε, ένα παράδειγμα για να κατανοήσουμε τη χρήση του.

# συμπερίληψη χρησιμοποιώντας χώρο ονομάτων std int main () {int len, sum = 0 cout<< 'Enter the no. of students in the class' <>len int * σημάδια = νέο int [len] // Δυναμική κατανομή μνήμης<< 'Enter the marks of each student' << endl for( int i = 0 i>* (σημάδια + i)} για (int i = 0 i

Εξήγηση:
Σε αυτό το παράδειγμα πρώτα ρωτάμε τον χρήστη για τον αριθμό των μαθητών σε μια τάξη και αποθηκεύουμε την αξία του στη μεταβλητή len. Στη συνέχεια, δηλώνουμε έναν πίνακα ακέραιου και εκχωρούμε χώρο στη μνήμη δυναμικά ίσο με την τιμή που είναι αποθηκευμένη στη μεταβλητή len χρησιμοποιώντας αυτήν τη δήλωση int * marks = new int [length], οπότε εκχωρείται ένα διάστημα ίσο με το 'μήκος * (μέγεθος 1 ακέραιος αριθμός)'. Ο υπόλοιπος κωδικός είναι αυτονόητος.

Προχωρώντας με αυτό το άρθρο σχετικά με τη δυναμική κατανομή μνήμης στο C ++

Δυναμική κατανομή μνήμης για αντικείμενα

Μπορούμε επίσης να εκχωρήσουμε δυναμικά αντικείμενα.

Όπως γνωρίζουμε ότι ο Κατασκευαστής μια ειδική συνάρτηση μέλους της τάξης που χρησιμοποιείται για την προετοιμασία ενός αντικειμένου και το Destructor είναι επίσης μια συνάρτηση μέλους της τάξης που καλείται κάθε φορά που το αντικείμενο βγαίνει εκτός εμβέλειας.

Το Destructor μπορεί να χρησιμοποιηθεί για την απελευθέρωση της μνήμης που έχει εκχωρηθεί στο αντικείμενο. Ονομάζεται στις ακόλουθες συνθήκες.

  • Όταν ένα τοπικό αντικείμενο είναι εκτός πεδίου
  • Για ένα καθολικό αντικείμενο, όταν ένας χειριστής εφαρμόζεται σε ένα δείκτη στο αντικείμενο της κλάσης

Μπορούμε και πάλι να χρησιμοποιήσουμε δείκτες, ενώ δυναμικά εκχωρούμε μνήμη σε αντικείμενα.

Ας δούμε ένα παράδειγμα μιας σειράς αντικειμένων.

#include χρησιμοποιώντας το namespace std class Random {public: Random () {cout<< 'Constructor' << endl } ~Random() { cout << 'Destructor' << endl } } int main() { Random* a = new Random[3] delete [] a // Delete array return 0 } 

Παραγωγή:

Εξήγηση:

Ο Κατασκευαστής θα κληθεί τρεις φορές αφού διαθέτουμε μνήμη σε τρία αντικείμενα της τάξης Random. Το Destructor θα κληθεί επίσης τρεις φορές κατά τη διάρκεια κάθε ενός από αυτά τα αντικείμενα. «Random * a = new Random [3]» αυτή η δήλωση είναι υπεύθυνη για δυναμική κατανομή μνήμης του αντικειμένου μας.

Έτσι, έχουμε φτάσει στο τέλος αυτού του άρθρου σχετικά με το 'Dynamic Memory Allocation C ++'. Εάν θέλετε να μάθετε περισσότερα, ρίξτε μια ματιά στο από την Edureka, μια αξιόπιστη διαδικτυακή εταιρεία μάθησης. Το μάθημα εκπαίδευσης και πιστοποίησης Java J2EE και SOA της Edureka έχει σχεδιαστεί για να σας εκπαιδεύσει τόσο για βασικές όσο και για προχωρημένες ιδέες Java μαζί με διάφορα πλαίσια Java όπως το Hibernate & Spring.

Έχετε μια ερώτηση για εμάς; Παρακαλώ αναφέρετέ το στην ενότητα σχολίων αυτού του ιστολογίου και θα επικοινωνήσουμε μαζί σας το συντομότερο δυνατό.