Динамичка алокација меморије у Ц++

Dinamicka Alokacija Memorije U C



Обично, док користи изворне кодове у Ц++ програмском језику, компајлер ручно додељује меморију променљивој за складиштење података. Речено је да је то додела статичке меморије. Ово је фиксна меморија која се не може променити када се једном декларише. За ову врсту алокације меморије, оперативни систем користи стек за складиштење података. У статичкој додели, меморија се додељује пре него што изворни код почне да се извршава.

Док се код динамичке алокације меморије, меморија додељује док је извршење почело. Ову меморију програматор додељује ручно у време извођења, такође познато као алокација меморије за време извршавања у Ц++. Величина динамичке меморије се може променити на било којој позицији у програму јер у тренутку декларације не помињемо величину која се може фиксирати. Ми само дајемо вредност директно променљивој.

Разлика у алокацији меморије у односу на нормалне варијабле

У нормалним варијаблама, меморија коју додељује компајлер се додељује и ослобађа аутоматски. Када програмер динамички додељује меморију, он тада мора да уклони или ослободи меморију када није од користи у даљем извршавању изворног кода. Ова ситуација узрокује „цурење меморије“ када се програм прекине док меморија није делоцирана.







Оператори за динамичку алокацију

У Ц++-у, два оператора помажу у алокацији и ослобађању меморије: „нев“ и „делете“ који се користе за доделу и делокацију меморије на бољи начин.



Нови оператер

Означава захтев за алокацијом меморије. Оператор нев иницијализује меморију и враћа адресу те додељене меморије променљивој показивача ако има довољно меморије.



Поинтер објекат = Нова података - тип ;

Избриши оператор

Као и оператор нев, оператор делете се користи за уклањање додељене меморије. У Ц++, програмер може да користи овај оператор за делокацију.





# Обриши поинтер_вариабле;

Пример 1

У овом примеру ћемо увести два показивача: један је показивач целобројног типа, а други је показивач са покретним покретом. Показивачи се иницијализују коришћењем знака звездице са њима.

# Инт * поинтИнт;
# Флоат *поинтфлоат;

Коришћењем ова два штампача, динамички ћемо алоцирати меморију.



Улога показивача у динамичкој алокацији:
Меморија складишног простора је развијена у облику блокова. Кад год извршимо програм или извршимо било коју операцију, меморија се додељује за ту специфичну сврху. Та меморија има посебну адресу која је повезана са програмом који идентификује који процес или програм је дозвољен тој меморији. Било ком меморијском слоту се приступа преко адресе којој припада. Дакле, ова адреса се чува преко показивача. Укратко, потребни су нам показивачи да приступимо меморији и да на исти начин доделимо одређени део меморије било ком задатку. Поинтери су потребни за чување адреса.

Како се кључна реч „нев“ користи за динамичку алокацију меморије у ручној додели, меморију додељује компајлер. Не морамо да додељујемо меморију у време извршавања. Али пошто је динамичка алокација насумична, морамо да идентификујемо показиваче и за процес везивања се користи овај нови оператор.

# Поинтинт = нови инт;

Слично, плутајући показивач је везан на исти начин. Након процеса везивања, доделићемо било коју вредност меморији коју желимо да резервишемо за било коју операцију. Декларацијом показивача меморији додељујемо одређену вредност.

# *поинтИнт = 50;

Декларисана је и флоат вредност за флоат тачке. Прикажите вредности након додељивања.

Као што смо већ расправљали, оператор „нев“ се користи за доделу, док се „делете“ користи за ослобађање меморије. Дакле, када завршите задатак или операцију у коду, ми ћемо уклонити меморију коју смо доделили задатку.

Боље је ослободити тај део меморије тако да било који други процес може да искористи ово. Применићемо ову алокацију на оба показивача.

Обриши тачку пловак ;

Једном када сачувате код у уређивачу текста, Убунту терминал вам омогућава да извршите изворни код унутар датотеке преко г++ компајлера.

$ г++ -о мем мем.ц
$ ./мем

Након извршења, видећете вредности додељене меморији.

Пример 2

Овај пример укључује интеракцију корисника. Узећемо бројчану променљиву која ће садржати вредност од корисника. Овај програм ће сачувати резултат у ГПА ученика. Сви резултати ће бити сачувани током извршавања.

Када корисник унесе број ученика, меморија се додељује сваком броју. Овде се иницијализује показивач типа флоат који ће се користити у алокацији меморије резултата.

Показивач узимамо у флоат-у пошто је ГПА у децималном запису. Узимамо низ типа показивача за ГПА јер може резултирати већем броју ученика.

Птр = Нова пловак [ на једном ]

Овај низ показивача са кључном речи „нев“ ће повезати извршење са меморијом. ГПА ће бити уписан за сваког ученика. Пошто нисмо упознати са бројем ученика које корисник жели да дода, користили смо фор петљу да унесемо ГПА до унетог броја. У сваком понављању петље, од корисника се тражи да унесе резултат који идентификује ученика. Када се резултат сачува, поново ћемо користити петљу да прикажемо све оцене ученика. На крају, низ типа показивача се брише, пошто је сврха динамичког складиштења остварена.

Избриши [ ] птр ;

Сада ћемо извршити горе поменути код. Од корисника ће се прво тражити да унесе број ученика. Тада ће се уписати ГПА за сваког ученика.

Пример 3

Овај пример користи операторе нев и делете за објекат класе. Ова класа садржи приватну променљиву целобројног типа која чува старост. У јавном делу класе креира се конструктор који ће иницијализовати узраст на број „10“. Овде се користи још једна функција која ће приказати старост која је иницијализована у конструктору.

Сада идемо ка главном програму за динамичку алокацију. Објекат класе се креира динамички.

Ученик * птр = Нова ученик ( ) ;

Када се објекат формира, конструктор ће бити имплементиран аутоматски. Биће извршен позив функције да би се добила старост. Ово ће се урадити преко птр.

Птр - > гетАге ( ) ;

И на крају, сећање ће бити ослобођено.

Закључак

Динамичка алокација меморије се додељује у време извршавања од стране програмера уместо фиксне меморије коју идентификује компајлер. Ова алокација је насумична и може се елиминисати након што се искористи. Док, у већини случајева, пре уклањања, процес извршења се зауставља и ова динамичка алокација онда узрокује цурење меморије. Овај феномен смо имплементирали у различитим приступима у Убунту Линук систему користећи Ц++ програмски језик.