Zarządzanie pamięcią: przykłady
W tym artykule opisano sposób wykonywania alokacji ramek i alokacji sterty dla każdego z trzech typowych rodzajów alokacji pamięci:
Alokacja tablicy bajtów
Aby przydzielić tablicę bajtów w ramce
Zdefiniuj tablicę, jak pokazano w poniższym kodzie. Tablica zostanie automatycznie usunięta, a jej pamięć zostanie odzyskana, gdy zmienna tablicowa zakończy jego zakres.
{ const int BUFF_SIZE = 128; // Allocate on the frame char myCharArray[BUFF_SIZE]; int myIntArray[BUFF_SIZE]; // Reclaimed when exiting scope }
Aby przydzielić tablicę bajtów (lub dowolny typ danych pierwotnych) na stercie
new
Użyj operatora z składnią tablicy pokazaną w tym przykładzie:const int BUFF_SIZE = 128; // Allocate on the heap char* myCharArray = new char[BUFF_SIZE]; int* myIntArray = new int[BUFF_SIZE];
Aby cofnąć przydział tablic z sterta
delete
Użyj operatora w następujący sposób:delete[] myCharArray; delete[] myIntArray;
Alokacja struktury danych
Aby przydzielić strukturę danych na ramce
Zdefiniuj zmienną struktury w następujący sposób:
struct MyStructType { int topScore; }; void MyFunc() { // Frame allocation MyStructType myStruct; // Use the struct myStruct.topScore = 297; // Reclaimed when exiting scope }
Pamięć zajmowana przez strukturę jest odzyskiwane po wyjściu z zakresu.
Aby przydzielić struktury danych na stercie
Użyj
new
polecenia , aby przydzielić struktury danych na stercie idelete
cofnąć ich przydział, jak pokazano w poniższych przykładach:// Heap allocation MyStructType* myStruct = new MyStructType; // Use the struct through the pointer ... myStruct->topScore = 297; delete myStruct;
Alokacja obiektu
Aby przydzielić obiekt na ramce
Zadeklaruj obiekt w następujący sposób:
{ CMyClass myClass; // Automatic constructor call here myClass.SomeMemberFunction(); // Use the object }
Destruktor obiektu jest automatycznie wywoływany, gdy obiekt kończy jego zakres.
Aby przydzielić obiekt na stercie
new
Użyj operatora , który zwraca wskaźnik do obiektu, aby przydzielić obiekty na stercie.delete
Użyj operatora , aby je usunąć.W poniższych przykładach stert i ramek przyjęto założenie, że
CPerson
konstruktor nie przyjmuje żadnych argumentów.// Automatic constructor call here CMyClass* myClass = new CMyClass; myClass->SomeMemberFunction(); // Use the object delete myClass; // Destructor invoked during delete
Jeśli argumentem konstruktora
CPerson
jest wskaźnik dochar
, instrukcja alokacji ramek to:CMyClass myClass("Joe Smith");
Instrukcja alokacji sterty to:
CMyClass* myClass = new CMyClass("Joe Smith");