Najlepszy samouczek Pamięć dynamiczna C ++ W 2024 r. W tym samouczku możesz dowiedzieć się nowe i usuwać operatorzy,Tablica dynamicznej alokacji pamięci,Obiekt Dynamiczna alokacja pamięci,
Rozumieć pamięci dynamicznej w C ++ jest to, w jaki sposób praca jest, aby stać się wykwalifikowanym C ++ programistów niezbędny. C ++ pamięci Program podzielony jest na dwie części:
Wiele razy, nie można z góry przewidzieć, ile pamięci jest wymagane, aby zapisać zmienną zdefiniowaną w konkretnej informacji niezbędnych do określenia wielkości pamięci potrzebnej przy starcie.
W C ++ można użyć specjalnego operatora jest przypisana do zmiennej danego typu pamięci w stercie w czasie wykonywania, zwraca przydzieloną przestrzeń adresową. Ten operator jestnowy operator.
Jeśli nie ma potrzeby dynamicznie przydzielać pamięć, można użyć operatoradelete, usunięte przez nowego operatora przed przydzielonej pamięci.
Oto nowy operator będzie jakakolwiek ogólna składnia danych typu dynamicznego przydzielania pamięci:
new data-type;
Oto dane typu może być dowolny wbudowanych typów danych, w tym, matryca może być dowolnego typu dane, w tym klasy lub struktury, w tym użytkownika.Przyjrzyjmy się najpierw przyjrzeć wbudowanych typów danych. Na przykład, możemy zdefiniować wskaźnik do wskaźnika typu double, a następnie żąda pamięć, pamięć jest alokowana w czasie wykonywania. Możemy użyćnowego operatora zgodnie z następującym stwierdzeniem tego dokonać:
double* pvalue = NULL; // 初始化为 null 的指针 pvalue = new double; // 为变量请求内存
Jeśli wolne powierzchnie magazynowe zostały wyczerpane, nie może skutecznie przydzielić pamięci. Wskazane jest, aby sprawdzić, czy nowy operator zwraca wskaźnik NULL i podjąć odpowiednie działania, co następuje:
double* pvalue = NULL; if( !(pvalue = new double )) { cout << "Error: out of memory." <<endl; exit(1); }
Funkcjamalloc () w języku C ++, C pojawiła się wciąż obecne, ale zaleca się, aby nie używać malloc (funkcyjny).i malloc () Funkcja nowe w porównaniu do jego główną zaletą jest to, że nie tylko przydzielić nową pamięć, stworzyła również przedmiot.
W każdej chwili, kiedy czujesz, że zmienne dynamiczne już przydzielone pamięci nie jest już potrzebna, można użyć operatora delete, aby zwolnić pamięć jest używany, co następuje:
delete pvalue; // 释放 pvalue 所指向的内存
Stosowany w powyższej koncepcji Poniższy przykład pokazuje, jak korzystać z nowych i usuwanie operatorów:
#include <iostream> using namespace std; int main () { double* pvalue = NULL; // 初始化为 null 的指针 pvalue = new double; // 为变量请求内存 *pvalue = 29494.99; // 在分配的地址存储值 cout << "Value of pvalue : " << *pvalue << endl; delete pvalue; // 释放内存 return 0; }
Gdy powyższy kod jest kompilowany i wykonany, że daje następujące wyniki:
Value of pvalue : 29495
Załóżmy, że chcemy tablica znaków (ciąg 20 znaków), aby przydzielić pamięci, możemy użyć powyższy przykład składni tablicy do dynamicznego przydzielania pamięci, co następuje:
char* pvalue = NULL; // 初始化为 null 的指针 pvalue = new char[20]; // 为变量请求内存
Aby usunąć tablicę, która właśnie stworzyliśmy, oświadczenie jest w następujący sposób:
delete [] pvalue; // 删除 pvalue 所指向的数组
Oto składnia ogólna nowy operator może przydzielić pamięci dla tablic wielowymiarowych, w następujący sposób:
int ROW = 2; int COL = 3; double **pvalue = new double* [ROW]; // 为行分配内存 // 为列分配内存 for(int i = 0; i < COL; i++) { pvalue[i] = new double[COL]; }
Zwolnij pamięć wielowymiarowej tablicy:
for(int i = 0; i < COL; i++) { delete[] pvalue[i]; } delete [] pvalue;
Obiekt nie różni się od prostych typów danych. Na przykład, rozważmy następujący kod użyjemy tablicę obiektów w celu wyjaśnienia tego pojęcia:
#include <iostream> using namespace std; class Box { public: Box() { cout << "调用构造函数!" <<endl; } ~Box() { cout << "调用析构函数!" <<endl; } }; int main( ) { Box* myBoxArray = new Box[4]; delete [] myBoxArray; // Delete array return 0; }
Jeśli chcesz Box zawiera cztery obiekty przydzielić tablicę pamięci, konstruktor zostanie wywołany cztery razy, w ten sam sposób, gdy usuniesz te obiekty, destruktor zostanie wywołana taką samą liczbę razy (cztery razy).
Gdy powyższy kod jest kompilowany i wykonany, że daje następujące wyniki:
调用构造函数! 调用构造函数! 调用构造函数! 调用构造函数! 调用析构函数! 调用析构函数! 调用析构函数! 调用析构函数!