Správa paměti C ++: nová a mazaná

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í newa deleteoperátorů, resp.

C ++ nový operátor

newOperá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 intpomocí newoperá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 newoperátor vrátí adresu umístění paměti.

V případě pole newvrátí operátor adresu prvního prvku pole.

Z výše uvedeného příkladu vidíme, že syntaxe pro použití newoperá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 deletese 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 intpromě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 deleteoperá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 inta 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 floatpole 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.

Zajímavé články...