Честопати се појавува одредена
ситуација во програмирањето кога податоците или влезот е динамичен по
природа, т.е. бројот на податочните ставки постојано се менува за време
на извршувањето на програмата. Таква е ситуацијата каде што програмата е
развиена за обработка на списоци на вработени во една организација.
Списокот расте како што се додаваат имињата и се намалува како што се
бришат имињата. Со зголемувањето на името, меморијата одвојува простор
на списокот за да примат дополнителни ставки на податоци. Таквите
ситуации во програмирањето бараат динамични техники за управување со
меморијата.
Постојат два начина преку кои може да се доделат мемории за складирање
на податоци. Двата начина се:
Статичката распределба на меморијата: каде што меморијата за
именуваните променливи е распределена од компајлерот. Точната големина и
складирањето мора да бидат познати во времето на компајлирање, а за
декларацијата на низата, големината треба да биде постојана.
Динамичка распределба на меморијата: каде што распределбата
на меморискиот простор се прави динамично во рамките на програмата и
меморискиот сегмент . Во овој случај, точниот простор или бројот на
ставката не мора да биде познат од компајлерот однапред. Покажувачите
играат голема улога во овој случај.
Програмерите можат динамично да одвојуваат простор за
складирање додека програмата работи, но програмерите не можат да
создаваат нови имиња на променливи "во лет", и поради оваа причина,
динамичката распределба бара два критериума:
Создавање на динамичен простор во меморијата
Зачувување на нејзината адреса во покажувач (за да може да се
пристапи до просторот)
Де-распределбата на меморијата е исто така дел од овој
концепт каде што се прави „чистење“ на просторот за променливи или друго
складирање на податоци. Работа на програмерот е да распредели динамички
креиран простор. За распределување на динамичка меморија, го користиме
операторот за бришење. Со други зборови, динамичката алокација на
меморијата се однесува на вршење на управување со меморијата за
динамичко распределување на меморијата рачно.
Да се распредели просторот динамично, користете оператор
new, проследен со типот што се доделува.
Еве дел од кодот што покажува употреба на
new:
new int; //dinamicki alokacira integer tip
new double; // dinamicki alokacira double tip
new int[60]; //dinamicki alokacira
niza od 60 elementi od integer tip
Горенаведените декларации не се толку корисни бидејќи распределениот
простор нема имиња. Но, линиите напишани подолу се корисни:
int * p;
// декларира покажувач р
p = new int;
// динамички алоцира int за полнење на
адресата во р
double * d;
// декларира покажувач d.
d = new
double;
// динамички алоцира double
за полнење на адресата во d
Операторот за бришење е потребен за да се ослободи мемориски простор.
Синтаксата на користење на ова е:
delete promenliva;
Еве едноставна програма што го покажува концептот на динамичка
распределба - алокација на меморијата:
Пример 1
#include <iostream>
using namespace std;
int main()
{
double * vrednost = NULL;
vrednost= new double;
*vrednost= 38184.26;
cout << "Vrednosta e : " << *vrednost<< endl;
delete vrednost;
}
Ако сакате
да одвоите меморија за низа карактери, т.е. низа од 40 карактери.
Користејќи ја истата синтакса, можете динамично да ја распределувате
меморијата како што е прикажано подолу.
char * niza = NULL; // Покажувачот
иницијализиран со NULL вредност
niza = new char [40]; //
Резервира меморија за
променливата
Пример 2
#include<iostream>
using namespace std;
int main() {
int x, n;
cout << "Kolku elementi ima nizata?" << "\n";
cin >>n;
int *arr = new int(n);
cout << "Napolnete ja nizata so " << n << " celi broevi" << endl;
for (x = 0; x < n; x++) {
cin >> arr[x];
}
cout << "Vie gi vnesovte slednite celi broevi : ";
for (x = 0; x < n; x++) {
cout << arr[x] << " ";
}
cout << endl;
delete [] arr;
return 0;
}
Пример 3
#include <iostream>
using
namespace
std;
int main() {
int num;
cout <<
"Vnesete broj na ucenici : ";
cin >> num;
float* ptr;
ptr =
new
float[num
];
cout <<
"Vnesete gi prosecite na ucenicite ." <<
endl;
for (
int i =
0; i < num; ++i) {
cout <<
"Ucenik " << i +
1 <<
": ";
cin >> *(ptr + i);
}
cout <<
"\nPrikaz na prosecite na ucenicite ." <<
endl;
for (
int i =
0; i < num; ++i) {
cout <<
"Ucenik " << i +
1 <<
" :" << *(ptr + i) <<
endl;
}
delete[] ptr;
return
0;
}
Динамичка алокација (распределување) на меморија со
користење на класи, конструктор и деструктор
#include <iostream>
using namespace std;
class stud {
public:
stud()
{
cout << "Konstruktor " << endl;
}
~stud()
{
cout << "Destruktor " << endl;
}
};
int main()
{
stud * S = new stud[6];
delete[] S;
}
Конструкторот ќе биде повикан шест пати бидејќи распределуваме меморија на шест
објекти од класата „stud“. Исто така, деструкторот ќе
биде повикан шест пати за време на секој од овие објекти.
Пример
// C++ dynamicka alokacija na klasa -
objekt so koristenje na pointer kon objekt
#include <iostream>
using namespace std;
class zid // deklaracija na klasa
{
int dolzina; // dve privatni
promenlivi clenovi na klasata
int sirina;
public:
zid(); // Default konstruktor
deklaracija
void set_vrednosti(int nova_dolzina,
int nova_sirina); // dve funkcii - metodi
int get_povrsina();
};
zid::zid() // Default konstruktor
{
dolzina = 8; //Default konstruktorot im dava pocetni
vrednosti na promenlivite na objektot
sirina = 8;
}
void zid::set_vrednosti(int nova_dolzina, int nova_sirina) //
metod-funkcija dava vrednosti na
promenlivite na objektot dobieni od main
{
dolzina = nova_dolzina;
sirina = nova_sirina;
}
int zid::get_povrsina() // ovoj metod - funkcija presmetuva vrednosti na
povrsinata na klasata zid
{
return (dolzina * sirina);
}
int main()
{
// Deklariranje na tri objekti od tip-klasa zid
zid mal_zid, sreden_zid, golem_zid;
// a pointer kon objekt od tip-klasa zid
zid *point;
mal_zid.set_vrednosti(5, 7);
// overriding na default
konstruktor so davanje vrednosti na promenlivite na objektite mal i
golem zid
golem_zid.set_vrednosti(15, 20);
point = new zid;
//gi koristi default vrednostite obezbedeni od konstruktorot na ovoj nov
objekt pokazuvan od pointer
cout<<"Za mal_zid.vrednosti(5, 7): ";
cout<<"Povrsinata na mal_zid e "<<mal_zid.get_povrsina()<<endl<<endl;
cout<<"Koristen default konstruktor so vrednosti
sreden_zid.vrednosti(8, 8): ";
cout<<"Povrsinata na sreden_zid e "<<sreden_zid.get_povrsina()<<endl<<endl;
cout<<"Za golem_zid.vrednosti(15, 20): ";
cout<<"Povrsinata na golem_zid e "<<golem_zid.get_povrsina()<<endl<<endl;
cout<<"Za vrednosti od default konstruktor , point->get_povrsina():
";
cout<<"Nova povrsina na zid "<<point->get_povrsina()<<endl<<endl;
cout<<"Za novi vrednosti, point->vrednosti(12, 12): ";
// novi vrednosti go override
konstruktorot
point->set_vrednosti(12, 12);
cout<<"Nova povrsina na zid "<<point->get_povrsina()<<endl<<endl;
delete point;
point = NULL;
return 0;
}