Latest web development tutorials

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:

调用构造函数!
调用构造函数!
调用构造函数!
调用构造函数!
调用析构函数!
调用析构函数!
调用析构函数!
调用析构函数!