You are on page 1of 29

C++ напредно

6. Мемориски Менаџмент,
Динамичка алокација, Референци
Д-р. Рамона Маркоска, вонр.проф

www.ramona-markoska.info
Содржина

—  Воведни напомени за статичка и динамичка


алокација на меморија
—  Мемориски менаџмент
—  Динамичка алокација на меморија- користење
—  Референци- дефиниција, примена
—  Референци и покажувачи
Користење на меморијата во С++
Користење на меморијата во С++
Мемориски менаџмент во С++
—  Управување со меморија, теориски- во програмското
инженерство подразбира резервирање на меморија за
податоци и ослободување на меморија од непотребни
(вишок) на податоци.
—  практично- на ниво на активности во рамките на
програмскиот јазик, подразбира создавање на
променливи и објекти и нивно бришење кога не се
потребни
—  Постапки и процедури за мемориски менаџмент
1.  рачно, преку функции од типот free, malloc, (C) , delete, new
(C++), и
2.  автоматски- преку предвидувачки алгоритми за анализа
на променливи и објекти, и ф-ции од надворешни
библиотеки
Статичко користење на меморијата во С++
—  При работа со скаларни променливи или низи
—  Однапред се предвидува и резервира одредено
количество на меморија, уште пред преведувањето
на програмата
—  Обично се алоцира повеќе меморија од
портребното
—  Се алоцира во областа на статичката меморија
—  Било каква измена која засега промена на
капацитет, бара наново преведување и
компајлирање
Динамичка алокација на меморијата во С++
—  Се случува истовремено со извршувањето на
програмата- нема потреба од наново предевудање
—  Бројот и големината на податоците не мора да се
однапред познати и прецизно планирани од
мемориски аспект
—  Просторот се алоцира во областа на динамичката
меморија
—  На податоците во зоната на динамичка меморија се
пристапува преку покажувач
—  Било каква измена која засега промена на
капацитет, бара наново преведување и
компајлирање
Алокација на динамичка меморија-
специфики
—  Разлика меѓу резервирање на меморија пред
извршувањето на програмата, преку декларација
на променливи и објекти и..
—  Резервирање на меморија, во текот на
извршувањето на програмата
—  Споредба-статичка меморија-стек, и динамичка
меморија
—  Подетални споредби после дефинирање на објекти и класи
Работа со динамичка меморија
—  Се користат функции од стандардни заглавија во С/
С++
—  Завземање на динамичката меморија
void* malloc(golemina),
каде golemina e потребната меморија изразена во
бајти или ..
void* calloc(n, golemina1) каде n е број на елементи
на низа, golemina1- потребна меморија за еден елемент од
низата. ( При ваква синтакса се врши иницијализација со
нули на зафатениот простор)


Работа со динамичка меморија
•  Функциите враќаат генерички воид покажувач,
што значи покажувачот е поставен на адреса но не е
прецизиран типот на податок.
•  Ваков покажувач не може да се дереференцира, и
едино може да се споредува од сите адресно
аритметички операции
•  За потреби на простап до меморија преку него,
потребно е кастирање (експлицитна конверзија) во
конкретен тип.
•  Во случај на неуспешна конверзија се враќа
вредност NULL


Работа со динамичка меморија

•  После активноста задолжително е ослободување на
зафатената меморија free(p), каде р покажува на
почетната адреса од блокот на меморија зафатен со
некоја од претходните ф-ции.
•  Постои и можност за промена на големината на
резервираниот простор:
void* realloc ( p, golemina) што значи, промена на
големината на резервирана меморија, која почнува од
ќелијата на која покажува р.
•  дополнителни ресурси:
•  http://mendo.mk/Lecture.do?id=15
•  http://www.cplusplus.com/doc/tutorial/dynamic/
Примена- динамички низи ( матрици)

Да се продискутираат можностите за манипулација со помош на


динамичка алокација, можности за сочувување и/или бришење
на оригинална матрица
Примена- динамички низи ( матрици)

Да се продискутираат можностите за манипулација со помош на


динамичка алокација, практично преку адресна аритметика врска
меѓу 2Д и 1Д низа.
Референци
Потсетување за начини пренесување на аргументите во
ф-ја, од аспект на тоа што се копира во параметарот:
—  По вредност pass-by-value, се проследува вредноста

—  По референца pass-by-reference, се преоследува


адресата (посреден пристап доп аргуметот кој се
менува заедно со параметарот на ф-та).
1.  Преку покажувачи – разгледано (т.н. “рачно”).
2.  Преку референци- преку нагласување до
компајлерот, “автоматски” да користи
проследување преку адреса, но наведување на
референца (адреса) како аргумент, наместо
покажувач ( пример со SWAP функција)
Проследување по референца- пример со swap()
Референци 2
•  Сите операции кои се извршуваат над параметарот во
ф-та се извршуваат над неговата вредност и немаат
никакво влијание на адресата
•  При повикување на ф-та во маин, на местото на
референците се повикуваат директно аргументите, а
не адресите.
•  Параметарот се иницијализира со адресата, без
никакво копирање на вредности
•  Нема потреба од дереференцирање
•  Самостојнни референци
Покажувачи и референци- споредба
—  Покажувач може да се пренасочи на друг објект-
референца не.
—  Покажувач може на почеток да не покажува на
ништо-референца секогаш покажува на ист
објект/променлива
—  Преку покажувач до променлива се пристапува
преку * - преку референца простапот е
непосреден.
—  Можни се низи од покажувачи- од референци не.
—  Можно е декларирање на покажувач на
покажувач- концепт референца на референца не.  
Придружување на референца кон променлива -
ефекти
Референци3
—  Референца како повратна вредност на ф-ја не може да
се декларира за помошни променливи ( исто како и
покажувач)
—  Се создава наново при секое повикување на ф-та

//funkcija cij povraten tip e referenca na int


int& f()
{ int i = 10;
return i;
//promenljiva i prestanuva da postoji po zavrsetok na f-
jata
}
Примери за ослободување на меморија
Пример1. С појаснување1
int *p=NULL; декларација на покажувач
p= malloc(sizeof(int)); динамичка алокација на
… меморија со големина на
тип int.
kod
…;

free(p);
ослободување на
p=NULL;
меморијата
дереференцирање
Примери за ослободување на меморија
Пример2. С++ појаснување2
int size=10; број на елементи на идна низа
int *p=NULL; декларација на покажувач
p= new int [size];
… динамичка алокација на
меморија со големина на тип
kod
(int) по број на елементи (size)
…;
delete[]p;

p=NULL;
ослободување на меморијата
дереференцирање
Практични примери- комбинирани, структури
и динамичка алокација на меморија

struct element;
{
int indbr;
char prezime[15];
char ime[15];
float prosek;
element *pok;
}
Практични примери- комбинирани, структури и
динамичка алокација на меморија

void vnes()
{
tekoven->pok=0;
cout<<"vnesi broj na indeks"<<endl;
cin>>tekoven->indbr;
cout<<"vnesi prezime"<<endl;
cin>>tekoven->prezime;
cout<<"vnesi ime"<<endl;
cin>>tekoven->ime;
cout<<"vnesi prosek"<<endl;
cin>>tekoven->prosek;
}
Практични примери- комбинирани, структури и
динамичка алокација на меморија

void ispis()
{
tekoven=pocetok;
while((tekoven->pok!=0)||(tekoven->pok==0))
{
cout<<"broj na indeks"<<tekoven->indbr<<endl;
cout<<"prezime"<<tekoven->prezime<<endl;
cout<<"ime"<<tekoven->ime<<endl;
cout<<"prosek"<<tekoven->prosek<<endl;
if(tekoven->pok==0)
break;
tekoven=tekoven->pok;
}
Практични примери- комбинирани, структури и
динамичка алокација на меморија

printf ("Pritisni 1 za kreiranje na lista i prv vnes, 2


za popolnuvanje, 3 ispis, 0 za izlez: ");
scanf ("%d", &izbor);
switch (izbor)
{

case 1:
tekoven=new element; //rezerviranje memorija
vnes();
pocetok= tekoven; // pozicioniranje
break;

case 2:
sleden=new element; // rezerviranje memorija
tekoven->pok=sleden; // premestuvanje na pokazuvach
vnes();
Практични примери- комбинирани, структури
и динамичка алокација на меморија

/* oznaka na kraj na lista */


#define KRAJ (struct ime *) 0
/* deklaracija na samoreferentna strktura */
struct ime
{
char *p_ime; // na niza znaci
struct ime *next; // na sleden element
};
/* pokazuvac na prviot element od listata (globalna varijabla)
*/
struct ime *start=KRAJ;
/* dodavaanje na nov element na krajot od listata */
Практични примери- комбинирани, структури и
динамичка алокација на меморија
void vneskraj(void)
{
struct ime *posleden, *nov;
char linija[128];
printf("Dodavanje nov element na kraj od listata .\n");
nov = (struct ime *) malloc(sizeof(struct ime));
if(nov == NULL)
{
printf("Nema dovolno memorija ");
Практични примери- комбинирани, структури и динамичка
алокација на меморија

nov->next=KRAJ;
printf("Vnesi ime > ");
scanf(" %[^\n]",linija);
>p_ime=(char *) malloc(strlen(linija)+1);
if(nov->p_ime == NULL) {
printf("Nema dovolno memorija ");
exit(-1);
}
strcpy(nov->p_ime,linija);
**) Целосно појаснување после делот со Листи
Задачи за вежби
Дел со структури и завршни примери од збирка

You might also like