Pamięć dynamiczna C ++
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:
- Stos: wszystkie zmienne zadeklarowane wewnątrz funkcji zajmie pamięć stosu.
- Sterty: jest to program pamięci nie jest używany, gdy działa program może być użyty do dynamicznego przydzielenia pamię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.
nowe i usuwać operatorzy
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
Tablica dynamicznej alokacji pamięci
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 Dynamiczna alokacja pamięci
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:
调用构造函数! 调用构造函数! 调用构造函数! 调用构造函数! 调用析构函数! 调用析构函数! 调用析构函数! 调用析构函数!