Διαχείριση μνήμης C ++: νέο και διαγραφή

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

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

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

Στο C ++, πρέπει να αφαιρέσουμε με μη αυτόματο τρόπο τη δυναμικά εκχωρημένη μνήμη αφού δεν έχουμε χρήση για τη μεταβλητή.

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

C ++ νέος χειριστής

Ο newχειριστής εκχωρεί μνήμη σε μια μεταβλητή. Για παράδειγμα,

 // declare an int pointer int* pointVar; // dynamically allocate memory // using the new keyword pointVar = new int; // assign value to allocated memory *pointVar = 45;

Εδώ, διαθέσαμε δυναμικά μνήμη για μια intμεταβλητή χρησιμοποιώντας τον newχειριστή.

Παρατηρήστε ότι χρησιμοποιήσαμε το δείκτη pointVar για να κατανείμουμε τη μνήμη δυναμικά. Αυτό συμβαίνει επειδή ο newχειριστής επιστρέφει τη διεύθυνση της θέσης μνήμης.

Στην περίπτωση ενός πίνακα, ο newχειριστής επιστρέφει τη διεύθυνση του πρώτου στοιχείου του πίνακα.

Από το παραπάνω παράδειγμα, μπορούμε να δούμε ότι η σύνταξη για τη χρήση του newτελεστή είναι

 pointerVariable = new dataType;

διαγραφή χειριστή

Όταν δεν χρειάζεται πλέον να χρησιμοποιούμε μια μεταβλητή που έχουμε δηλώσει δυναμικά, μπορούμε να αφαιρέσουμε τη μνήμη που καταλαμβάνεται από τη μεταβλητή.

Για αυτό, χρησιμοποιείται ο deleteχειριστής. Επιστρέφει τη μνήμη στο λειτουργικό σύστημα. Αυτό είναι γνωστό ως αφαίρεση μνήμης .

Η σύνταξη για αυτόν τον τελεστή είναι

 delete pointerVariable;

Εξετάστε τον κωδικό:

 // declare an int pointer int* pointVar; // dynamically allocate memory // for an int variable pointVar = new int; // assign value to the variable memory *pointVar = 45; // print the value stored in memory cout << *pointVar; // Output: 45 // deallocate the memory delete pointVar;

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

Μετά την εκτύπωση των περιεχομένων του pointVar, αφαιρέσαμε τη μνήμη χρησιμοποιώντας delete.

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

Παράδειγμα 1: Κατανομή δυναμικής μνήμης C ++

 #include using namespace std; int main() ( // declare an int pointer int* pointInt; // declare a float pointer float* pointFloat; // dynamically allocate memory pointInt = new int; pointFloat = new float; // assigning value to the memory *pointInt = 45; *pointFloat = 45.45f; cout << *pointInt << endl; cout << *pointFloat << endl; // deallocate the memory delete pointInt, pointFloat; return 0; )

Παραγωγή

 45 45.45

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

 delete pointInt, pointFloat;

Σημείωση: Η δυναμική κατανομή μνήμης μπορεί να κάνει τη διαχείριση μνήμης πιο αποτελεσματική.

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

Παράδειγμα 2: C ++ νέο και διαγράψτε το Operator for Arrays

 // C++ Program to store GPA of n number of students and display it // where n is the number of students entered by the user #include #include using namespace std; int main() ( int num; cout <> num; float* ptr; // memory allocation of num number of floats ptr = new float(num); cout << "Enter GPA of students." << endl; for (int i = 0; i < num; ++i) ( cout << "Student" << i + 1 <> *(ptr + i); ) cout << "Displaying GPA of students." << endl; for (int i = 0; i < num; ++i) ( cout << "Student" << i + 1 << " :" << *(ptr + i) << endl; ) // ptr memory is released delete () ptr; return 0; )

Παραγωγή

Εισαγάγετε συνολικό αριθμό μαθητών: 4 Εισαγάγετε ΣΔΣ μαθητών. Φοιτητής1: 3.6 Φοιτητής2: 3.1 Φοιτητής3: 3.9 Φοιτητής4: 2.9 Εμφάνιση ΣΔΣ μαθητών. Φοιτητής 1: 3,6 Φοιτητής 2: 3,1 Φοιτητής 3: 3,9 Φοιτητής 4: 2,9

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

Στη συνέχεια, διαθέσαμε δυναμικά τη μνήμη για τον floatπίνακα χρησιμοποιώντας νέο.

Εισάγουμε δεδομένα στον πίνακα (και αργότερα τα εκτυπώνουμε) χρησιμοποιώντας σημειογραφία δείκτη.

Αφού δεν χρειαζόμαστε πλέον τον πίνακα, αφαιρούμε τη μνήμη του πίνακα χρησιμοποιώντας τον κωδικό delete () ptr;.

Παρατηρήστε τη χρήση ()μετά delete. Χρησιμοποιούμε τις αγκύλες ()για να υποδηλώσουμε ότι η αφαίρεση μνήμης είναι αυτή ενός πίνακα.

Παράδειγμα 3: C ++ νέο και διαγραφή τελεστής για αντικείμενα

 #include using namespace std; class Student ( int age; public: // constructor initializes age to 12 Student() : age(12) () void getAge() ( cout << "Age = " << age 

Output

 Age = 12

In this program, we have created a Student class that has a private variable age.

We have initialized age to 12 in the default constructor Student() and print its value with the function getAge().

In main(), we have created a Student object using the new operator and use the pointer ptr to point to its address.

The moment the object is created, the Student() constructor initializes age to 12.

We then call the getAge() function using the code:

 ptr->getAge();

Notice the arrow operator ->. This operator is used to access class members using pointers.

ενδιαφέροντα άρθρα...