| Časová náročnost: 17 minut |
V jazyce C existují standardní funkce
malloc() a
free() pro dynamickou alokaci. Tyto funkce jsou samozřejmě dostupné i v jazyce C++, ale existuje zde i mnohem bezpečnější a jednodušší způsob přidělování a uvolňování paměti. V C++ můžeme přidělit paměť pomocí
new a uvolnit ji pomocí
delete.
Tyto operátory mají následující formát:
|
privátní-proměnná = new typ
delete privátní-proměnná
Typem je míněn specifikátor objektu, jemuž chceme přidělit paměť. Privátní proměnná je ukazatelem k tomuto typu.
Operátor new vrací ukazatel do dynamicky přidělované paměti, která je dostatečně velká pro uložení objektu typu typ. Operátor delete uvolňuje paměť. Může být volán pouze s ukazatelem, který byl předtím přidělen při volání new. Při volání new, nebo delete se špatným ukazatelem může dojít k havárii systému.
Není-li dostatek paměti pro provedení alokačního příkazu, operátor new vrátí prázdný ukazatel nebo vyjímku. O vyjímkách se zmíníme v některé z dalších kapitol.
|
|
Ačkoliv provádějí new a delete činnosti podobné malloc() a free(), mají několik výhod:
- New automaticky přiděluje dostatek paměti pro uložení objektu daného typu. Nemusíme tedy pro výpočet potřebného místa používat například operátoru sizeof().
- New automaticky vrací ukazatel určeného typu.
- New i delete mohou být přetěžovány.
- Je možné inicializovat dynamicky alokovaný objekt.
Následující jednoduchý příklad nám ukáže použití operátorů new a delete pro přidělení a uvolnění paměti pro hodnotu integer.
|
| Příklad 5.6. |
|
#include <iostream.h>
int main()
{
int *p;
p = new int; // alokace mista pro int
if(!p) {
cout << "Chyba pri alokaci\n";
return 1;
}
*p = 1000;
cout << "Hodnota integer: " << *p << "\n";
delete p; // uvolneni pameti
return 0;
}
|
|
Počáteční hodnotu můžeme dynamicky alokovaným objektům přidělit podle následujícího formátu:
privátní-proměnná = new typ (počáteční-hodnota)
Pro alokaci jednorozměrného pole můžeme použít tento formát:
privátní-proměnná = new typ [rozměr]
Ve výše uvedeném případě ukáže privátní proměnná na začátek pole daného rozměrem.
Pozn.: Nelze inicializovat dynamicky alokované pole.
Ke zrušení dynamicky alokovaného pole lze použít následující formát delete:
delete [] privátní-proměnná
Výše uvedená syntaxe způsobí, že se zavolá destruktor pro každý prvek pole. Nezpůsobí to, že by byla privátní-proměnná uvolněná vícekrát.
Následující program alokuje pole pro hodnoty typu integer.
|
| Příklad 5.7. |
|
#include <iostream.h>
int main()
{
int *p;
p = new int [5]; // alokujeme misto pro pole 5 integeru
if(!p) {
cout << "Chyba pri alokaci\n";
return 1;
}
int i;
for(i=0; i<5; i++) p[i] = i;
for(i=0; i<5; i++) {
cout << "Hodnota integer v p[" << i << "]: ";
cout << p[i] << "\n";
}
delete [] p; // uvolneni pameti
return 0;
}
|
Následující program vytvoří dynamické pole objektů a nakonec volá destruktor pro každý prvek pole.
| Příklad 5.8. |
|
#include <iostream.h>
class samp {
int i, j;
public:
void set_ij(int a, int b) { i=a; j=b; }
~samp() { cout << "Destruktor...\n"; }
int get_product() { return i*j; }
};
int main()
{
samp *p;
int i;
p = new samp [10]; // alokace objektu pole
if(!p) {
cout << "Chyba pri alokaci\n";
return 1;
}
for(i=0; i<10; i++)
p[i].set_ij(i, i);
for(i=0; i<10; i++) {
cout << "Produkt [" << i << "] is: ";
cout << p[i].get_product() << "\n";
}
delete [] p;
return 0;
}
|
| Flashová animace |
|
Kliknutím na ikonu spustíte animaci.
|