User Tools

Site Tools


cpp:dynamic_memory

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

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://www.cplusplus.com/reference/cstdlib/malloc/|malloc]] και [[http://www.cplusplus.com/reference/cstdlib/free/|free]] που εξακολουθούν να υφίστανται και στη C++, ορίζονται οι τελεστές **new** και **delete** για δέσμευση και αποδέσμευση μνήμης.  
- 
-<WRAP center round tip 80%> 
-Δεν θα πρέπει να συγχέεται ποτέ η χρήση **malloc/free** με **new/delete** για τη δέσμευση και αποδέσμευση μνήμης. Οποιοσδήποτε χώρος δεν δεσμεύτηκε με //malloc// θα πρέπει να ελευθερωθεί με //free//. Αντίστοιχα ότι δεσμεύθηκε με //new// θα πρέπει να ελευθερωθεί με //delete//. 
- 
-Οι τελεστής **new** εκτός από τη δέσμευση μνήμης επιτρέπει και τη αρχικοποίηση μεταβλητών βασικού ή αναφορικού τύπου με χρήση του αντίστοιχου κατασκευαστή. 
-</WRAP> 
- 
-Ο τελεστής **new** έχει δύο μορφές (**new** και **new[]**). Η πρώτη χρησιμοποιείται για την δέσμευση μνήμης ενός αντικειμένου ή μιας μεταβλητής βασικού τόπου, ενώ η δεύτερη για την δέσμευση μνήμης και την αρχικοποίηση ενός πίνακα. Δείτε το παρακάτω παράδειγμα χρήσης του τελεστή **new**. 
- 
-<code c++ dynamicMemory.cpp> 
-#include <iostream> 
-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] << "\t"; 
-  } 
-  cout << endl; 
-  delete []p; 
-  delete num; 
-} 
-</code> 
- 
-Για βασικούς τύπους δεδομένων επίσης μπορείτε κατά την χρήση του τελεστή **new** να αρχικοποιήσετε τη μεταβλητή ως εξής: 
- 
-<code c++ dynamicMemory.cpp> 
-#include <iostream> 
-using namespace std; 
- 
-int main () { 
-  int *num; 
-  num = new int(5); 
-  cout << "num: " << num; 
-} 
-</code> 
- 
-===== Έλεγχος δέσμευσης μνήμης ===== 
- 
-Κατά τη δέσμευση μνήμης δεν είναι απαραίτητο να γίνονται οι έλεγχοι για το κατά πόσο η δέσμευση απέτυχε. Στην περίπτωση που η δέσμευση μνήμης αποτύχει τότε παράγεται ένα //exception// τύπου ''bad_alloc'' το οποίο καλούμαστε να διαχειριστούμε διαφορετικά το πρόγραμμα θα τερματίσει. Εάν δεν επιθυμούμε ο τελεστής **new** να πετάξει exception θα πρέπει να αλλάξουμε τον τρόπο κλήσης και να ελέγξουμε την επιστρεφόμενη τιμή ως εξής: 
- 
-<code c++ dynamicMemory.cpp> 
-#include <iostream> 
-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 << "Allocation failure!\n"; 
-    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] << "\t"; 
-  } 
-  cout << endl; 
-  delete []p; 
-  delete num; 
-} 
-</code> 
- 
  
cpp/dynamic_memory.txt · Last modified: 2021/04/27 05:01 (external edit)