V tomto kurzu se naučíme efektivně spravovat paměť v C ++ pomocí nových operací a operací mazání pomocí příkladů.
C ++ nám umožňuje přidělit paměť proměnné nebo pole za běhu. Toto se nazývá dynamické přidělování paměti.
V jiných programovacích jazycích, jako je Java a Python, kompilátor automaticky spravuje paměti přidělené proměnným. Ale v C ++ tomu tak není.
V C ++ musíme dynamicky přidělené paměti uvolnit ručně poté, co jsme proměnnou nepoužili.
Můžeme rozdělit a pak DEALLOCATE paměť dynamicky pomocí new
a delete
operátorů, resp.
C ++ nový operátor
new
Operátor přiděluje paměť proměnné. Například,
// declare an int pointer int* pointVar; // dynamically allocate memory // using the new keyword pointVar = new int; // assign value to allocated memory *pointVar = 45;
Zde jsme int
pomocí new
operátoru dynamicky přidělili paměť pro proměnnou .
Všimněte si, že k dynamickému přidělení paměti jsme použili ukazatel pointVar. Je to proto, že new
operátor vrátí adresu umístění paměti.
V případě pole new
vrátí operátor adresu prvního prvku pole.
Z výše uvedeného příkladu vidíme, že syntaxe pro použití new
operátoru je
pointerVariable = new dataType;
odstranit operátor
Jakmile již nebudeme muset používat proměnnou, kterou jsme dynamicky deklarovali, můžeme uvolnit paměť obsazenou proměnnou.
K tomu delete
se používá operátor. Vrátí paměť operačnímu systému. Toto se nazývá uvolnění paměti .
Syntaxe pro tento operátor je
delete pointerVariable;
Zvažte kód:
// 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;
Zde máme dynamicky přidělenou paměť pro int
proměnnou pomocí ukazatele pointVar.
Po vytištění obsahu pointVar jsme uvolnili paměť pomocí delete
.
Poznámka : Pokud program používá velké množství nechtěné paměti new
, může dojít k selhání systému, protože pro operační systém nebude k dispozici žádná paměť. V takovém případě může delete
operátor pomoci systému havarovat.
Příklad 1: C ++ dynamická alokace paměti
#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; )
Výstup
45 45,45
V tomto programu jsme dynamicky přidělili paměť dvěma proměnným typu int
a float
. Po přiřazení hodnot k nim a jejich vytištění jsme nakonec uvolnili paměti pomocí kódu
delete pointInt, pointFloat;
Poznámka: Dynamické přidělování paměti může zefektivnit správu paměti.
Zvláště pro pole, kde mnohokrát neznáme velikost pole až do doby běhu.
Příklad 2: C ++ nové a odstranit operátor pro pole
// 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; )
Výstup
Zadejte celkový počet studentů: 4 Zadejte GPA studentů. Student1: 3,6 Student2: 3,1 Student3: 3,9 Student4: 2,9 Zobrazení GPA studentů. Student1: 3,6 Student2: 3,1 Student3: 3,9 Student4: 2,9
V tomto programu jsme požádali uživatele, aby zadal počet studentů a uložil jej do proměnné num.
Poté jsme dynamicky přidělili paměť pro float
pole pomocí new.
Zadáme data do pole (a později je vytiskneme) pomocí ukazatele ukazatele.
Poté, co pole již nepotřebujeme, uvolníme pomocí kódu paměť pole delete () ptr;
.
Všimněte si použití ()
po delete
. Používáme hranaté závorky ()
, abychom naznačili, že uvolnění paměti je pole.
Příklad 3: C ++ nový a odstranit operátor pro objekty
#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.