5.4. New a Delete

Časová náročnost
Č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:

upozornění
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.

upozornění Ačkoliv provádějí new a delete činnosti podobné malloc() a free(), mají několik výhod:
  1. 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().
  2. New automaticky vrací ukazatel určeného typu.
  3. New i delete mohou být přetěžovány.
  4. 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.

src/5_6.cpp
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;
}

upozornění

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.

src/5_7.cpp
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.

src/5_8.cpp
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;
}


flash\newade.swf
Flashová animace
Kliknutím na ikonu spustíte animaci.