This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
|
cpp:dynamic_memory [2017/04/11 10:14] gthanos |
cpp:dynamic_memory [2021/04/27 05:01] |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ====== Δυναμική διαχείριση μνήμης ====== | ||
| - | |||
| - | Όπως και στη C έτσι και στη C++ η μνήμη μπορεί να δεσμευθεί δυναμικά στο χώρο δεδομένων που ονομάζεται //heap//. Εκτός των συναρτήσεων [[http:// | ||
| - | |||
| - | <WRAP center round tip 80%> | ||
| - | Δεν θα πρέπει να συγχέεται ποτέ η χρήση **malloc/ | ||
| - | |||
| - | Οι τελεστής **new** εκτός από τη δέσμευση μνήμης επιτρέπει και τη αρχικοποίηση μεταβλητών βασικού ή αναφορικού τύπου με χρήση του αντίστοιχου κατασκευαστή. | ||
| - | </ | ||
| - | |||
| - | Ο τελεστής **new** έχει δύο μορφές (**new** και **new[]**). Η πρώτη χρησιμοποιείται για την δέσμευση μνήμης ενός αντικειμένου ή μιας μεταβλητής βασικού τόπου, ενώ η δεύτερη για την δέσμευση μνήμης και την αρχικοποίηση ενός πίνακα. Δείτε το παρακάτω παράδειγμα χρήσης του τελεστή **new**. | ||
| - | |||
| - | <code c++ dynamicMemory.cpp> | ||
| - | #include < | ||
| - | using namespace std; | ||
| - | |||
| - | int main () { | ||
| - | int *num, *p; | ||
| - | num = new int; | ||
| - | cout << "Enter number of elements: "; | ||
| - | cin >> *num; | ||
| - | p = new int[*num]; | ||
| - | for(int i=0; i<*num; i++) { | ||
| - | cout << "Next integer: "; | ||
| - | cin >> p[i]; | ||
| - | } | ||
| - | for(int i=0; i<*num; i++) { | ||
| - | cout << p[i] << " | ||
| - | } | ||
| - | cout << endl; | ||
| - | delete []p; | ||
| - | delete num; | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | Για βασικούς τύπους δεδομένων επίσης μπορείτε κατά την χρήση του τελεστή **new** να αρχικοποιήσετε τη μεταβλητή ως εξής: | ||
| - | |||
| - | <code c++ dynamicMemory.cpp> | ||
| - | #include < | ||
| - | using namespace std; | ||
| - | |||
| - | int main () { | ||
| - | int *num; | ||
| - | num = new int(5); | ||
| - | cout << "num: " << num; | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | ===== Έλεγχος δέσμευσης μνήμης ===== | ||
| - | |||
| - | Κατά τη δέσμευση μνήμης δεν είναι απαραίτητο να γίνονται οι έλεγχοι για το κατά πόσο η δέσμευση απέτυχε. Στην περίπτωση που η δέσμευση μνήμης αποτύχει τότε παράγεται ένα // | ||
| - | |||
| - | <code c++ dynamicMemory.cpp> | ||
| - | #include < | ||
| - | using namespace std; | ||
| - | |||
| - | int main () { | ||
| - | int *num, *p; | ||
| - | num = new int; | ||
| - | cout << "Enter number of elements: "; | ||
| - | cin >> *num; | ||
| - | p = new (nothrow) int[*num]; | ||
| - | if(p==NULL) { | ||
| - | cout << " | ||
| - | return 0; | ||
| - | } | ||
| - | for(int i=0; i<*num; i++) { | ||
| - | cout << "Next integer: "; | ||
| - | cin >> p[i]; | ||
| - | } | ||
| - | for(int i=0; i<*num; i++) { | ||
| - | cout << p[i] << " | ||
| - | } | ||
| - | cout << endl; | ||
| - | delete []p; | ||
| - | delete num; | ||
| - | } | ||
| - | </ | ||
| - | |||