Správa pamäte C ++: nová a odstránená

V tomto tutoriále sa naučíme efektívne spravovať pamäť v C ++ pomocou nových a mazacích operácií pomocou príkladov.

C ++ nám umožňuje alokovať pamäť premennej alebo poľa za behu. Toto sa nazýva dynamické prideľovanie pamäte.

V iných programovacích jazykoch, ako sú Java a Python, kompilátor automaticky spravuje pamäte pridelené premenným. Ale to nie je prípad C ++.

V jazyku C ++ musíme dynamicky alokovanú pamäť uvoľniť manuálne, keď už premennú nemáme k dispozícii.

Môžeme rozdeliť a potom DEALLOCATE pamäť dynamicky pomocou newa deleteoperátorov, resp.

C ++ nový operátor

newOperátor prideľuje pamäť premenné. Napríklad,

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

Tu sme intpomocou newoperátora dynamicky alokovali pamäť pre premennú .

Všimnite si, že na dynamické pridelenie pamäte sme použili ukazovateľ pointVar. Je to preto, že newoperátor vráti adresu umiestnenia v pamäti.

V prípade poľa newoperátor vráti adresu prvého prvku poľa.

Z vyššie uvedeného príkladu vidíme, že syntax pre použitie newoperátora je

 pointerVariable = new dataType;

vymazať Operátor

Keď už nepotrebujeme používať premennú, ktorú sme dynamicky deklarovali, môžeme uvoľniť pamäť obsadenú premennou.

K tomu deleteslúži operátor. Vráti pamäť operačnému systému. Toto sa nazýva uvoľnenie pamäte .

Syntax tohto operátora je

 delete pointerVariable;

Zváž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;

Tu sme dynamicky pridelili pamäť pre intpremennú pomocou ukazovateľa pointVar.

Po vytlačení obsahu pointVar sme uvoľnili pamäť pomocou delete.

Poznámka : Ak program využíva veľké množstvo nežiaducej pamäte new, môže dôjsť k zlyhaniu systému, pretože pre operačný systém nebude k dispozícii žiadna pamäť. V takom prípade môže deleteoperátor pomôcť systému pri páde.

Príklad 1: C ++ pridelenie dynamickej pamäte

 #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ýkon

 45 45,45

V tomto programe sme dynamicky alokovali pamäť na dve premenné typu inta float. Po tom, čo sme im priradili hodnoty a vytlačili sme ich, nakoniec pomocou kódu pridelíme pamäte

 delete pointInt, pointFloat;

Poznámka: Dynamické prideľovanie pamäte môže zefektívniť správu pamäte.

Najmä pre polia, kde mnohokrát nevieme veľkosť poľa až do doby spustenia.

Príklad 2: C ++ nový a vymazaný operátor pre polia

 // 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ýkon

Zadajte celkový počet študentov: 4 Zadajte GPA študentov. Študent1: 3,6 Študent2: 3,1 Študent3: 3,9 Študent4: 2,9 Zobrazenie GPA študentov. Študent1: 3,6 Študent2: 3,1 Študent3: 3,9 Študent4: 2,9

V tomto programe sme požiadali používateľa, aby zadal počet študentov a uložil ho do premennej num.

Potom sme dynamicky pridelili pamäť pre floatpole pomocou new.

Dáta zadávame do poľa (a neskôr ich tlačíme) pomocou ukazovateľa smeru.

Keď už pole nepotrebujeme, uvoľníme pomocou poľa kód pamäte poľa delete () ptr;.

Všimnite si použitie ()po delete. Používame hranaté zátvorky, ()aby sme naznačili, že uvoľnenie pamäte je v poli.

Príklad 3: C ++ nový a vymazaný operátor pre 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.

Zaujímavé články...