Zarządzanie pamięcią C ++: nowe i usuń

W tym samouczku nauczymy się efektywnie zarządzać pamięcią w C ++ przy użyciu operacji new i delete z pomocą przykładów.

C ++ pozwala nam przydzielić pamięć zmiennej lub tablicy w czasie wykonywania. Jest to znane jako dynamiczna alokacja pamięci.

W innych językach programowania, takich jak Java i Python, kompilator automatycznie zarządza pamięcią przydzieloną do zmiennych. Ale tak nie jest w C ++.

W C ++ musimy ręcznie cofnąć alokację dynamicznie przydzielonej pamięci, gdy zmienna nie jest już potrzebna.

Możemy przydzielać, a następnie zwalniać pamięć dynamicznie, używając odpowiednio operatorów newi delete.

Nowy operator C ++

newOperatora przydziela pamięć zmiennej. Na przykład,

 // declare an int pointer int* pointVar; // dynamically allocate memory // using the new keyword pointVar = new int; // assign value to allocated memory *pointVar = 45;

Tutaj mamy dynamicznie przydzieloną pamięć dla intzmiennej za pomocą newoperatora.

Zauważ, że użyliśmy wskaźnika pointVar do dynamicznego przydzielania pamięci. Dzieje się tak, ponieważ newoperator zwraca adres lokalizacji pamięci.

W przypadku tablicy newoperator zwraca adres pierwszego elementu tablicy.

Z powyższego przykładu widzimy, że składnia użycia newoperatora to

 pointerVariable = new dataType;

usuń operatora

Gdy nie musimy już używać zmiennej, którą zadeklarowaliśmy dynamicznie, możemy zwolnić pamięć zajmowaną przez tę zmienną.

W tym celu deleteużywany jest operator. Zwraca pamięć do systemu operacyjnego. Jest to znane jako zwolnienie pamięci .

Składnia tego operatora to

 delete pointerVariable;

Rozważ kod:

 // declare an int pointer int* pointVar; // dynamically allocate memory // for an int variable pointVar = new int; // assign value to the variable memory *pointVar = 45; // print the value stored in memory cout << *pointVar; // Output: 45 // deallocate the memory delete pointVar;

Tutaj mamy dynamicznie przydzieloną pamięć dla intzmiennej za pomocą wskaźnika pointVar.

Po wydrukowaniu zawartości pointVar zwolniliśmy przydział pamięci za pomocą delete.

Uwaga : Jeśli program używa dużej ilości niechcianej pamięci new, system może ulec awarii, ponieważ nie będzie dostępnej pamięci dla systemu operacyjnego. W takim przypadku deleteoperator może pomóc systemowi w razie awarii.

Przykład 1: dynamiczne przydzielanie pamięci w języku C ++

 #include using namespace std; int main() ( // declare an int pointer int* pointInt; // declare a float pointer float* pointFloat; // dynamically allocate memory pointInt = new int; pointFloat = new float; // assigning value to the memory *pointInt = 45; *pointFloat = 45.45f; cout << *pointInt << endl; cout << *pointFloat << endl; // deallocate the memory delete pointInt, pointFloat; return 0; )

Wynik

 45 45.45

W tym programie dynamicznie przydzieliliśmy pamięć do dwóch zmiennych typu inti float. Po przypisaniu im wartości i wydrukowaniu ich ostatecznie zwalniamy pamięć za pomocą kodu

 delete pointInt, pointFloat;

Uwaga: dynamiczna alokacja pamięci może zwiększyć wydajność zarządzania pamięcią.

Szczególnie w przypadku tablic, w których często nie znamy rozmiaru tablicy do czasu wykonania.

Przykład 2: C ++ new and delete Operator for Arrays

 // C++ Program to store GPA of n number of students and display it // where n is the number of students entered by the user #include #include using namespace std; int main() ( int num; cout <> num; float* ptr; // memory allocation of num number of floats ptr = new float(num); cout << "Enter GPA of students." << endl; for (int i = 0; i < num; ++i) ( cout << "Student" << i + 1 <> *(ptr + i); ) cout << "Displaying GPA of students." << endl; for (int i = 0; i < num; ++i) ( cout << "Student" << i + 1 << " :" << *(ptr + i) << endl; ) // ptr memory is released delete () ptr; return 0; )

Wynik

Wpisz całkowitą liczbę uczniów: 4 Wpisz GPA uczniów. Student1: 3.6 Student2: 3.1 Student3: 3.9 Student4: 2.9 Prezentowanie GPA uczniów. Student1: 3.6 Student2: 3.1 Student3: 3.9 Student4: 2.9

W tym programie poprosiliśmy użytkownika o wprowadzenie liczby uczniów i zapisanie jej w zmiennej num.

Następnie dynamicznie przydzieliliśmy pamięć dla floattablicy przy użyciu new.

Dane wprowadzamy do tablicy (a następnie drukujemy) za pomocą notacji wskaźnikowej.

Gdy tablica nie jest już potrzebna, zwalniamy jej pamięć za pomocą kodu delete () ptr;.

Zwróć uwagę na użycie ()after delete. Używamy nawiasów kwadratowych (), aby wskazać, że zwolnienie pamięci dotyczy tablicy.

Przykład 3: C ++ nowy i usuń operator dla obiektów

 #include using namespace std; class Student ( int age; public: // constructor initializes age to 12 Student() : age(12) () void getAge() ( cout << "Age = " << age 

Output

 Age = 12

In this program, we have created a Student class that has a private variable age.

We have initialized age to 12 in the default constructor Student() and print its value with the function getAge().

In main(), we have created a Student object using the new operator and use the pointer ptr to point to its address.

The moment the object is created, the Student() constructor initializes age to 12.

We then call the getAge() function using the code:

 ptr->getAge();

Notice the arrow operator ->. This operator is used to access class members using pointers.

Interesujące artykuły...