cpp:dynamic_memory

Differences

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

Link to this comparison view

Next revision
Previous revision
Next revision Both sides next revision
cpp:dynamic_memory [2017/04/11 10:00]
gthanos created
cpp:dynamic_memory [2017/06/08 06:22]
gthanos
Line 9: Line 9:
 </WRAP> </WRAP>
  
-Ο τελεστής **new** έχει δύο μορφές (**new** και **new[]**). Η πρώτη χρησιμοποιείται για την δέσμευση μνήμης ενός αντικειμένου ή μιας μεταβλητής βασικού τόπου, ενώ η δεύτερη για την δέσμευση μνήμης και την αρχικοποίηση ενός πίνακα. Δείτε το παρακάτω παράδειγμα χρήσης του τελεστή **new**.+Ο τελεστής **new** έχει δύο μορφές (**new** και **new[]**). Η πρώτη χρησιμοποιείται για την δέσμευση μνήμης ενός αντικειμένου ή μιας μεταβλητής βασικού τόπου, ενώ η δεύτερη για την δέσμευση μνήμης και την αρχικοποίηση ενός πίνακα. 
  
-<code dynamicMemory c++>+Σε αναλογία με τον τελεστή **new** ο τελεστής **delete** για την αποδέσμευση μνήμης έχει και αυτός δύο μορφές (**delete** και **delete[]**). Η πρώτη χρησιμοποιείται για την αποδέσμευση μνήμης ενός αντικειμένου ή μιας μεταβλητής βασικού τόπου, ενώ η δεύτερη για την αποδέσμευση μνήμης ενός πίνακα. Δείτε το παρακάτω παράδειγμα χρήσης των τελεστών **new** και **delete**. 
 + 
 +<code c++ dynamicMemory.cpp>
 #include <iostream> #include <iostream>
 using namespace std; using namespace std;
Line 36: Line 38:
 Για βασικούς τύπους δεδομένων επίσης μπορείτε κατά την χρήση του τελεστή **new** να αρχικοποιήσετε τη μεταβλητή ως εξής: Για βασικούς τύπους δεδομένων επίσης μπορείτε κατά την χρήση του τελεστή **new** να αρχικοποιήσετε τη μεταβλητή ως εξής:
  
-<code dynamicMemory c++>+<code c++ dynamicMemory.cpp>
 #include <iostream> #include <iostream>
 using namespace std; using namespace std;
Line 47: Line 49:
 </code> </code>
  
 +===== Έλεγχος δέσμευσης μνήμης =====
  
 +Κατά τη δέσμευση μνήμης δεν είναι απαραίτητο να γίνονται οι έλεγχοι για το κατά πόσο η δέσμευση απέτυχε. Στην περίπτωση που η δέσμευση μνήμης αποτύχει τότε παράγεται ένα //exception// τύπου ''bad_alloc'' το οποίο καλούμαστε να διαχειριστούμε, διαφορετικά το πρόγραμμα θα τερματίσει. Εάν δεν επιθυμούμε ο τελεστής **new** να πετάξει //exception// θα πρέπει να αλλάξουμε τον τρόπο κλήσης προσθέτοντας τη δεσμευμένη έκφραση ''(nothrow)'' αμέσως μετά τον τελεστή **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 (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>
 +
 +===== Παράδειγμα δέσμευσης μνήμης για την αρχικοποίηση ενός διδιάστατου πίνακα =====
 +
 +<code cpp dynamicMemory2D.cpp>
 +#include <iostream>
 +#include <stdlib.h>
 +
 +using namespace std;
 +
 +int main(int argc, char *argv[]) {
 +  int **array2d, rows, columns;
 +  
 +  cout << "Enter number of rows: ";
 +  cin >> rows;
 +  
 +  cout << "Enter number of columns: ";
 +  cin >> columns;
 +  
 +  array2d = new (nothrow) int*[rows];
 +  if(array2d == NULL) {
 +    cerr < "Memory allocation error!\n";
 +    return -1;
 +  }
 +  for(int i=0; i<rows; i++) {
 +    array2d[i] = new (nothrow) int[columns];
 +    if(array2d[i] == NULL) {
 +      cerr < "Memory allocation error!\n";
 +      return -1;
 +    }
 +  }
 +  
 +  for(int i=0; i<rows; i++) {
 +    for(int j=0; j<columns; j++) {
 +      array2d[i][j] = i+j;
 +      cout << array2d[i][j] << "  ";
 +    }
 +    cout << endl;
 +  }
 +  
 +  for(int i=0; i<rows; i++) 
 +    delete[] array2d[i];
 +  delete[] array2d;
 +}
 +</code>
  
  
cpp/dynamic_memory.txt · Last modified: 2021/04/27 05:01 (external edit)