Како радити са динамичком расподелом меморије Ц ++?



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

Динамичко додељивање меморије У Ц ++-у је веома важна карактеристика која вам омогућава да размотрите своје захтеве да бисте се позабавили потребом за ресурсима у стварном времену. У овом чланку бисмо истраживали Детаљно истраживање. Следећи путокази ће бити обрађени у овом чланку,

Па кренимо са овим чланком о Динамичком додељивању меморије у Ц ++





Потребна вам је динамичка алокација меморије?

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

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



јава дубока копија вс плитка копија

У горенаведеном случају, немамо представу о тачној величини низа све до времена компајлирања (када рачунар компајлира код и стринг унесе корисник). У таквим случајевима користимо Нова оператер.

Ц ++ дефинише два унарна оператора Нова и избрисати који извршавају задатак додељивања и ослобађања меморије током извођења. Будући да ови оператори (нови и брисање) раде на слободној меморији меморије (Хеап мемори), они се називају и оператери слободне меморије. Показивачи пружају потребну подршку за систем динамичке алокације меморије у језику Ц ++.

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



Глобалне и локалне променљиве додељују се меморији током времена компајлирања. Међутим, не можемо додати ниједну глобалну или локалну променљиву током извођења. Ако програм треба да користи променљиву количину меморије, морали бисмо да доделимо меморију током извођења, према потреби и када је то потребно. И наравно, овде рутинске динамичке алокације могу послужити сврси.

Разлике између статичке алокације меморије и динамичке алокације меморије:

Ово је основна меморијска архитектура која се користи за било који програм Ц ++:

Меморија - Динамичко додељивање меморије - Едурека

Требаће нам оваква слика

Стек се користи за статичко додељивање меморије, а гомила за динамичко додељивање меморије, оба се чувају у РАМ-у рачунара.

Променљиве које се додељују у стеку док се додељивање статичке меморије складишти директно у меморију и приступ тој меморији је врло брз, такође се њеном алокацијом бави када се програм компајлира. Када функција или метода позове другу функцију која заузврат може позвати другу функцију и тако даље, извршавање свих ових функција остаје суспендовано све док последња функција не врати своју вредност. Стек се увек чува у ЛИФО (задњи у првом излазу) редоследу, последњи резервисани блок је увек следећи блок који се ослобађа. Ово помаже у праћењу стека, јер ослобађање блока из стека није ништа друго него прилагођавање једног показивача.

Варијаблама додијељеним на гомили додијељена је меморија у вријеме извођења за вријеме динамичке додјеле меморије. Приступ овој меморији је нешто спорији у поређењу са стеком, али величина гомиле је ограничена само величином виртуелне меморије. Елемент гомиле нема међусобне зависности и увек му се може приступити случајно у било ком тренутку. Блок можемо доделити у било ком тренутку и ослободити га у било ком тренутку. То отежава праћење који делови гомиле се у било ком тренутку додељују или ослобађају.

Настављамо са овим чланком о Динамичкој расподели меморије у језику Ц ++

Додељивање меморије коришћењем Нова Кључна реч

У Ц ++-у Нова Оператор се користи за додељивање меморије током извршавања, а меморија се додељује у бајтовима. Тхе Нова Оператор означава захтев за динамичком расподелом меморије на Купи. Ако је на располагању довољно меморије, тада Нова оператор иницијализује меморију и враћа адресу ново додељене и иницијализоване меморије на променљиву показивача.

Синтакса:

тип података * поинтер_наме = нови тип података

Пример:

инт * птр = нев инт // Променљиву можемо декларисати током динамичке алокације на следећа два начина. инт * птр = нев инт (10) инт * птр = нев инт {15} // нови оператор се такође користи за додељивање блока (низа) меморије типа података типа. инт * птр = нев инт [20] // Горња изјава динамички додељује меморију за 20 целих бројева непрекидно типа инт и враћа показивач на први елемент секвенце на показивач ‘птр’.

Белешка : Ако гомила нема довољно меморије за додељивање, нови захтев указује на неуспех избацивањем изузетка стд :: бад_аллоц, осим ако се са новим оператором не користи „нотхров“, у ком случају враћа НУЛЛ показивач. Због тога је добра пракса проверити показивачку променљиву коју производи нев пре него што је употребите у програму.

Настављамо са овим чланком о Динамичкој расподели меморије у језику Ц ++

Додељивање меморије коришћењем избрисати Кључна реч:

Једном када се меморија хрпе додели променљивој или објекту класе помоћу Нова кључну реч, можемо ослободити тај меморијски простор помоћу избрисати кључна реч.

Синтакса:

делете поинтер_вариабле // Овде је поинтер_вариабле показивач који показује на објект података који је створио нев. делете [] поинтер_вариабле // За ослобађање динамички додељене меморије низа на коју указује поинтер-променљива користимо следећи облик делете:

Пример:

делете птр делете [] птр

Белешка : Обим или животни век објекта је време за које објекат остаје у меморији током извршавања програма. Додела меморије хеап-а је спорија од стека, јер у хеап-у не постоји посебан редослед којим можете доделити меморију, док у стеку следи ЛИФО.

Настављамо са овим чланком о Динамичкој расподели меморије у језику Ц ++

Динамички додељивање низова

Главна употреба концепта динамичке алокације меморије је за додељивање меморије низу када је морамо декларисати одређивањем њене величине, али нисмо сигурни у њу.

Погледајмо пример за разумевање његове употребе.

#инцлуде усинг намеспаце стд инт маин () {инт лен, сум = 0 цоут<< 'Enter the no. of students in the class' <>лен инт * маркс = нев инт [лен] // Динамичка додела меморије цоут<< 'Enter the marks of each student' << endl for( int i = 0 i>* (ознаке + и)} за (инт и = 0 и

Објашњење:
У овом примеру прво тражимо од корисника број ученика у разреду и његову вредност чувамо у променљивој лен. Затим декларишемо низ целих бројева и додељујемо му простор у меморији динамички једнак вредности сачуваној у променљивој лен помоћу ове изјаве инт * маркс = нев инт [ленгтх] па му се додељује простор једнак 'ленгтх * (сизе 1 цео број) '. Остатак кода је саморазумљив.

Настављамо са овим чланком о Динамичкој расподели меморије у језику Ц ++

Динамичко додељивање меморије за објекте

Такође можемо динамички алоцирати објекте.

Као што знамо да је Цонструцтор посебна функција члана класе која се користи за иницијализацију објекта, а Деструцтор је такође функција члана класе која се позива кад год објекат излази из опсега.

Деструцтор се може користити за ослобађање меморије додељене објекту. Позива се у следећим условима.

  • Када локални објекат изађе из опсега
  • За глобални објекат, када се оператор примењује на показивач на објекат класе

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

Погледајмо пример низа објеката.

#инцлуде усинг спаце намес стд цласс Рандом {публиц: Рандом () {цоут<< 'Constructor' << endl } ~Random() { cout << 'Destructor' << endl } } int main() { Random* a = new Random[3] delete [] a // Delete array return 0 } 

Излаз:

Објашњење:

фибоначијев низ у ц ++

Конструктор ће бити позван три пута, јер додељујемо меморију три објекта класе Рандом. Деструктор ће такође бити позван три пута током сваког од ових објеката. „Рандом * а = нев Рандом [3]“ ова изјава је одговорна за динамичко додељивање меморије нашег објекта.

Тако смо дошли до краја овог чланка о „Динамичкој расподели меморије Ц ++“. Ако желите да сазнате више, погледајте Едурека, поуздана компанија за учење на мрежи. Едурекин курс за обуку и сертификацију Јава Ј2ЕЕ и СОА осмишљен је тако да вас оспособи за основне и напредне Јава концепте заједно са разним Јава оквирима попут Хибернате & Спринг.

Имате питање за нас? Молимо вас да га помените у одељку за коментаре на овом блогу и јавићемо вам се што је пре могуће.