Home >> C++ návod >> Dynamické proměnné

Dynamické proměnné

V dnešní lekci budeme bezpodminěčně potřebovat znalost polí a ukazatelů, jelikož se budeme zabývat dynamickými proměnnými, které s těmito prvky pracují.

Co je to dynamická proměnná?

Doposud jsme měli ve všech programech, které jsme si v tomto tutoriálu ukázali, k dispozici právě tolik paměti, kolik jsme si deklarovali pro naše proměnné. Vzpomeňme si na lekci o polích, konkrétně na problemtiku rozměru pole.

Kdykoliv jsme chtěli deklarovat nějaké pole, museli jsme přesně definovat rozměr tohoto pole, protože rozměr pole musí být konstantní číslo. Zde však nastavá problém a to ve chvíli, kdy uživatel chce do pole vložit nějaký neznámý počet hodnot. Může se totiž stát, že tento počet bude přesahovat rozměr pole. V takovém případě musí přijít na řadu dynamická proměnná.

Deklarace dynamické proměnné, operátor new

K vytvoření dynamické proměnné se používá ukazatel ve spojení s operátorem new. Za operátorem new následuje specifikace datového typu proměnné, například:

int *pepe = new int;

Tento zápis vytvoří v paměti místo pro uložení jedné hodnoty typu int. Pokud však požadujeme místo pro uložení více hodnot, použijeme zápis následující:

int *pepe = new int[4];

V tomto případě se vytvoří v paměti místo pro uložení 4 hodnot (pole) typu int. Z předchozí lekce již víme, že ukazatel pepe bude defaultně odkazovat na první prvek tohoto pole. Pro představu se podívejme ná následující ilustraci:

ukazatele

K prvnímu prvku tohoto pole lze přistopit pomocí identifikátoru z indexem nula - pepe[0] nebo pomocí dereference ukazatele - *pepe. K dalšímu prvku pak přístoupíme pomocí pepe[1] nebo *(pepe + 1) a tak dále.

Nyní si možná pokládáte otázku: Jaký je rozdíl mezi klasickým polem a polem vzniklým přiřazením dynamické paměti ukazateli? Odpověď na tuto otázka spočívá v rozměru pole. Zatímco rozměr klasického pole musí být udán konstantou, kterou je třeba vhodně zvolit ještě před spuštěním programu, tak u dynamické proměnné můžeme k tomuto účelu použít proměnnou. To umožňuje nastavit právě takový rozměr pole, jaký v určitou chvíli potřebujeme a to až po spuštění programu. Příklad:

cout << "Zadej kolik chces zadat hodnot: ";
cin >> rozmer;
int *pepe = new int[rozmer];

Nyní bude ukazateli pepe přiřazeno tolik paměti, kolik zvolí uživatel. To však předstvuje riziko, že uživatel zadá požadavek na přidělení více paměti, než je v danou chvíli k dispozici, jelikož operační paměť počítače není neomezený zdroj.

Pro tyto případy existují v jazyce C++ machanismy, které kontrolují zda byla paměť uspěšně přidelena či nikoliv.

My si však představíme pouze jednu a to metodu zvanou nothrow obsaženou v knihovně <new>, což můžeme přeložit jako "nezahodit". Tento název má svůj význam, jelikož tato metoda na situaci, kdy není dostatek paměti, reaguje tak, že běh programu neukončí, ale přiřadí ukazateli hodnotu nula (NULL) a zpracování programu dál pokračuje.

Použití této metody není nijak složité, stačí pouze připsat při deklaraci za operátor new klíčové slovo (nothrow). Příklad:

int *pepe = new (nothrow) int;

V tomto případě však vůbec nepoznáme, že k přidělení paměti nedošlo, protože program proběhne bez jakékoliv chybové hlášky. Samozřejmě však nebude správně fungovat. Proto je dobré tuto hlášku pro tento případ uměle vytvořit. Využijeme toho, že se v případě nedostatku paměti nastaví ukazateli hodnota nula (NULL):

cout << "Zadej kolik chces zadat hodnot: ";
cin >> rozmer;
int *pepe = new (nothrow) int[rozmer];
if (pepe == 0) {
cout << "Nedostatek paměti!" << endl;
};

Problém s nedostatkem operační paměti u malých projektů však příliš často řešit nebudete. Tento problém se týká předvším velkých projektů.

Operátor delete

Operátor delete slouží k uvolnění paměti zabrané dynamickou proměnnou. Vzhledem k tomu, že dynamickou proměnnou potřebujeme pouze v určitém okamžiku a poté co splní svůj účel se stává nepotřebnou, můžeme tuto paměť uvolnit pro další účely. Příkaz delete zapisujeme ve tvarech:

delete ukazatel;
delete [] ukazatel;

První variantu použijeme pro uvolnění paměti přiřazené pro jeden element, zatímco druhou pro uvolnění paměti přiřazené pro pole elementů.

Příklad na závěr

Na závěr si uvedeme příklad, kde shrneme vše z této lekce:

#include <iostream>
#include <new>
using namespace std;

int main (){
  int x,rozmer;
  cout << "Zadej kolik chces zadat hodnot: ";
  cin >> rozmer;
  int *pepe = new (nothrow) int[rozmer];

  if (pepe == 0){
  cout << "Nedostatek pameti!" << endl;
  }
  else{
   for (x = 0; x < rozmer; x++){
   cout << "Zadej " << x+1 << ". cislo: ";
   cin >> pepe[x];
   }

   cout << "\nZadane hodnoty: ";
   for (x = 0; x < rozmer; x++){
   cout << "\n" << pepe[x];
   delete [] pepe;
   }
  }
return 0;
}
C++ Návod
Úvod do C++
Volba programu
Struktura programu
Proměnné
Konstanty
Operátory
Vstup a výstup
Řídící struktury
Funkce - 1.část
Funkce - 2.část
Pole
Práce s textovými řetězci
Ukazatele - 1.část
Ukazatele - 2.část
Dynamické proměnné
Datové struktury
©2008 - 2011 Klikzone.cz
Ráj aut - inzerce nových i ojetých aut