next up previous contents
Elõre: Dinamikus objektumok megszüntetése Fel: Dinamikus objektumok Vissza: Dinamikus objektumok

Dinamikus objektumok létrehozása

Dinamikus objektumok létrehozására a C++ new operátora szolgál. Tekintsük erre a következõ példát:

            circle *egy_kor = new circle(100,200,50);
Ennek hatására az egy_kor azonosítójú circle típusra mutató pointer megkapja egy sizeof(circle) darab byte méretû, circle típusú objektum számára lefoglalt tárterület címét. A tárterület-foglalás során végrehajtásra kerül a circle( ) konstruktor-hívás is. A létrehozott új "kör" középpontjának koordinátái rendre 100 és 200, míg a sugár értéke 50 lesz.

A new operátorral tömbök számára is foglalhatunk helyet. A new-nak ez az alternatív szintaxisa a következõ:

        new típus [méret]

A kifejezés értéke az adott típus számára lefoglalt adott méretû tömbre mutató pointer lesz.

A new-val történõ memória-foglaláskor fellépõ hibákat a _new_handler pointer (elõredefiniált globális változó) által mutatott függvény kezeli le. Alapértelmezésben sikertelen tárterület-foglalási kisérlet esetén new visszatérési értéke NULL, és programunk futása úgy folytatódhat, mintha mi sem történt volna, ugyanis a _new_handler-en keresztül aktivizált hibakezelõ nem csinál semmit. Ugyanakkor lehetõségünk van arra, hogy a _new_handler-t egy saját hibakezelõre állítsuk a set_new_handler( ) függvényhívás segítségével. Ezt a következõ példa szemlélteti:

#include <iostream.h>
#include <stdlib.h>
// ***********************************************************
void out_of_store(void)       // Sajat hibakezelo-fv. new-hoz
// ***********************************************************
{
        cerr << "operator new failed: out of store\n";
        exit(1);              // cerr-t lasd 3.11.3. alatt
}
// ***********************************************************
typedef void (*PF)();         // Fuggvenyre mutato tipus
extern PF set_new_handler(PF);// _new_handler-t allitja
struct pp { double x,y,z,w;   // Nagy struktura. Ennek pro-
            long   a,b,c,d; };// balunk sok helyet foglalni
// ***********************************************************
main()         // _new_handler atallitasat szemlelteto program
// ***********************************************************
{
  set_new_handler(&out_of_store);
  pp *p = new pp[65535];
  cout << "Meghivtuk new-t, p = " << long(p) << '\n';
}                             // cout-ot is lasd 3.11.3 allatt
// ***********************************************************
A fenti program soha sem fog "normálisan" lefutni, hanem mindig az operator new failed: out of store üzenetet kapjuk a képernyõn és visszatérünk 1-es hibakóddal az operációs rendszerhez.