Programozás alapjai 2. (2. ea) C++

Hasonló dokumentumok
Programozás alapjai II. (1. ea) C++

Programozás alapjai II. (1. ea) C++

Programozás alapjai II. (2. ea) C++

Programozás alapjai II. (2. ea) C++

Programozás alapjai II. (1. ea) C++

Programozás alapjai II. (1. ea) C++

1. Template (sablon) 1.1. Függvénysablon Függvénysablon példányosítás Osztálysablon

1. Alapok. Programozás II

Programozás II. 2. Dr. Iványi Péter

Programozás II. 4. Dr. Iványi Péter

Alprogramok, paraméterátadás

Pénzügyi algoritmusok

1. Bevezetés A C++ nem objektumorientált újdonságai 3

Programozás alapjai C nyelv 8. gyakorlat. Mutatók és címek (ism.) Indirekció (ism)

Programozás alapjai II. (7. ea) C++

- 1 - Konstansok használata. Döntsük el, van-e fordítási idejű hiba az alábbi programrészletekben! a) const char * str="zh"; str[0]++;

Programozás alapjai II. (7. ea) C++

Programozás II. 2. gyakorlat Áttérés C-ről C++-ra

Mutatók és címek (ism.) Programozás alapjai C nyelv 8. gyakorlat. Indirekció (ism) Néhány dolog érthetőbb (ism.) Változók a memóriában

Programozás C++ -ban

Az alábbi példában a Foo f(5); konstruktor hívása után mennyi lesz f.b értéke? struct Foo { int a, b; Foo(int c):a(c*2),b(c*3) {} };

500. AA Megoldó Alfréd AA 500.

Fejlett programozási nyelvek C++ Sablonok és adatfolyamok

Pénzügyi algoritmusok

Globális operátor overloading

3. Osztályok II. Programozás II

Programozás alapjai II. (9. ea) C++ többszörös öröklés, cast, perzisztencia

Pénzügyi algoritmusok

Bevezetés a C++ programozási nyelvbe

Kivételek, kivételkezelés a C++ nyelvben

C++ Gyakorlat jegyzet 7. óra

Informatika terméktervezőknek

Függvények. Programozás alapjai C nyelv 7. gyakorlat. LNKO függvény. Függvények(2) LNKO függvény (2) LNKO függvény (3)

Programozás alapjai C nyelv 7. gyakorlat. Függvények. Függvények(2)

Bevezetés a C++ programozási nyelvbe

1) Hány byte-on tárol a C++ egy karaktert (char)? implementáció-függő ( viszont lásd 79. megjegyzés ) 1 8 4

503.AA Megoldo Arisztid 503.A

Programozás C és C++ -ban

STL gyakorlat C++ Izsó Tamás május 9. Izsó Tamás STL gyakorlat/ 1

Programozás alapjai II. (4. ea) C++

117. AA Megoldó Alfréd AA 117.

Programozás alapjai II. (6. ea) C++

Programozási Nyelvek: C++

Bevezetés Kiíratás Beolvasás Formázás Fájlkezelés Gyakorló feladatok C++ I/O. Bevezetés. Izsó Tamás február 20. Izsó Tamás C++ I/O / 1

Programozás alapjai C nyelv 5. gyakorlat. Írjunk ki fordítva! Írjunk ki fordítva! (3)

C vagy C++? Programozási Nyelvek és Fordítóprogramok Tanszék. Pataki Norbert. Programozási Nyelvek I.

Bevezetés a programozásba I.

Programozás C++ -ban 2007/4

Bevezetés a programozásba. 8. Előadás: Függvények 2.

C++ programozási nyelv Konstruktorok-destruktorok

Algoritmizálás + kódolás C++ nyelven és Pascalban

Osztály és objektum fogalma

Bevezetés a programozásba Előadás: Objektumszintű és osztályszintű elemek, hibakezelés

Statikus adattagok. Statikus adattag inicializálása. Speciális adattagok és tagfüggvények. Általános Informatikai Tanszék

Programozás II. 3. gyakorlat Objektum Orientáltság C++-ban

C++ programok fordítása

Programozás alapjai II. (1. ea) C++

1.1. A forrásprogramok felépítése Nevek és kulcsszavak Alapvető típusok. C programozás 3

Java és web programozás

C++ programozási nyelv Struktúrák a C++ nyelvben Gyakorlat

OOP #14 (referencia-elv)

C++ Gyakorlat jegyzet 8. óra

Programozás alapjai II. (7. ea) C++

Mit ír ki? feladatok megoldásokkal

5. Gyakorlat. struct diak {

Programozás alapjai C nyelv 10. gyakorlat. Standard függvények. Union

C programozás. 6 óra Függvények, függvényszerű makrók, globális és

Bevezetés a programozásba. 11. Előadás: Esettanulmány

Bevezetés a programozásba I 10. gyakorlat. C++: alprogramok deklarációja és paraméterátadása

Programozás II gyakorlat. 8. Operátor túlterhelés

Osztályok. 4. gyakorlat

A C++ nyelvben a függvény nevek túlterhelésével biztonságosabbá tehetnénk az adatok kiírását és beolvasását.

C programozási nyelv

Szövegek C++ -ban, a string osztály

Bevezetés a programozásba I.

Programozás C++ -ban

Az osztályok csomagokba vannak rendezve, minden csomag tetszőleges. Könyvtárhierarhiát fed: Pl.: java/util/scanner.java

Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós március 3. Széchenyi István Egyetem, Gy r

Programozás alapjai gyakorlat. 4. gyakorlat Konstansok, tömbök, stringek

Objektum Orientált Programozás. 11. Kivételkezelés 44/1B IT MAN

Memóriakezelés, dinamikus memóriakezelés

Maximum kiválasztás tömbben

Visual C++ osztály készítése, adattagok, és metódusok, láthatóság, konstruktor, destruktor. Objektum létrehozása, használata, öröklés.

Programozás C++ -ban 2007/1

A C++ Standard Template Library rövid összefoglalás

500. CC Megoldó Alfréd CC 500.

A feladat lényege egy felhasználói típusnak a zsák típusnak a megvalósítása.

Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós április 4. Széchenyi István Egyetem, Gy r

128. AA Megoldó Alfréd AA 128.

Programozás 1. Dr. Iványi Péter

1000.AA Megoldo Alfréd 1000.A

Programozás C++ -ban 2007/7

Bevezetés a programozásba. 9. Előadás: Rekordok

228. AA Default Konstruktor AA 228.

500.AJ Megoldó Magyar Magdolna 500.J

Gregorics Tibor Modularizált programok C++ nyelvi elemei 1

Java II. I A Java programozási nyelv alapelemei

Programozás C és C++ -ban

A C programozási nyelv V. Struktúra Dinamikus memóriakezelés

C++ Standard Template Library (STL)

Átírás:

Programozás alapjai 2. (2. ea) C++ névterek, memóriakezelés Szeberényi Imre, Somogyi Péter BME IIT <szebi@iit.bme.hu> M Ű E G Y E T E M 1 7 8 2 C++ programozási nyelv BME-IIT Sz.I. 2019.02.12. - 1 - Hol tartunk? Változó definíció bárhol Struktúranév típussá válik Korábban csak preprocesszorral megoldható dolgok nyelvi szintre (const, bool, inline, template)... Kötelező a prototípus használata Referencia, cím szerinti paraméterátadás Többarcú fv.-ek (polimorf, túlterhelés, overload)... Alapértelmezésű (default) argumentumok I/O stream... Névterek Dinamikus memória kez. nyelvi szint. (new, delete) C++ programozási nyelv BME-IIT Sz.I. 2019.02.12. - 2 - Névterek, scope operátor A moduláris programozás támogatására külön névterületeket definiálhatunk. Ez ebben levő nevekre (azonosítókra) a hatókör (scope) operátorral (::), vagy a using namespace direktívával hivatkozhatunk. namespace nevterem { int alma; float fv(int i); char *nev; nevterem::alma = 12; float f = nevterem::fv(5); using namespace nevterem; alma = 8; float f = fv(3); C++ programozási nyelv BME-IIT Sz.I. 2019.02.12. - 3 -

using direktíva A using namespace direktívával a teljes névteret, vagy annak egy részét láthatóvá tehetjük: using namespace nevterem; alma = 8; float f = fv(3); using nevterem::alma; using nevterem::fv; alma = 8; float f = fv(3); nevterem::nev = "Dr. Bubo"; C++ programozási nyelv BME-IIT Sz.I. 2019.02.12. - 4 - Név nélküli névtér Biztosítani akarjuk, hogy egy kódrészlet csak az adott fordítási egységből legyen elérhető. Névütközés biztosan nem lesz. #include <iostream> namespace { // nincs neve void solvetheproblem() { std::cout << "Solved\n"; // névtér vége int main() { solvetheproblem(); C++ programozási nyelv BME-IIT Sz.I. 2019.02.12. - 5 - Névterek egymásba ágyazása, alias A névterek egymásba ágyazhatók. Egy létező névterhez egy újabb nevet rendelhetünk (rövidítés). namespace kis_nevterem { namespace belso_terem { int fontos; namespace bent = ::kis_nevterem::belso_terem; bent::fontos = 8; C++ programozási nyelv BME-IIT Sz.I. 2019.02.12. - 6 -

Argument-dependent lookup (ADL) Nem minősített függvények hívásakor a fv. argumentumainak névterében is keres. namespace N { struct P { int x, y;; void fx(p p) {... void fy(int i) {... P origo; N-ben keres int main() { fx(n::origo); N::fy(4); C++ programozási nyelv BME-IIT Sz.I. 2019.02.12. - 7 - Az std névtér Standard függvények konstansok és objektumok névtere. Ebben van standard az I/O is. Az egyszerű példákban kinyitjuk az egész névteret az egyszerűbb írásmód miatt: using namespace std; Komoly programokban ez nem célszerű. Header-be pedig soha ne tegyük! Miért? C++ programozási nyelv BME-IIT Sz.I. 2019.02.12. - 8 - Standard I/O madártávlatból #include <iostream> using std::cout; using std::endl; fv, overload + ADL miatt int main() { cout << Hello C++\n ; // std::operator<<(std::cout, "Hello C++\n"); int i; std::cin >> i cout << 2 * << i = << 2 * i << endl; C++ programozási nyelv BME-IIT Sz.I. 2019.02.12. - 9 -

<iostream> Standard I/O objektumait definiáló fejléc fájl valahogy így néz ki: #include <ios> #include <streambuf> #include <istream> #include <ostream> namespace std { extern istream cin; extern ostream cout; extern ostream cerr; extern ostream clog;... Kiírás: operator<< egy ostream típushoz (insert) Beolvasás: operator>> egy istream típushoz (extract) A működés bonyolult. Most csak a felszínt kapargatjuk. C++ programozási nyelv BME-IIT Sz.I. 2019.02.12. - 10 - <iostream> /2 Az iostream kapcsán megismert eszközök a fájlkezelésnél is használhatók. A stream típus logikai környezetben igazzá, vagy hamissá konvertálódik attól függően, hogy hibás állapotban van-e a stream. A streamek működése, belső állapota többek között manipulátorokkal befolyásolható C++ programozási nyelv BME-IIT Sz.I. 2019.02.12. - 11 - <iostream> /3 #include <iostream> #include <iomanip> using namespace std; int main() { cout << "Hexa konverer:" << endl; int x; while (cin >> x) cout << hex << x << endl; logikai környezet. manipulátorok C++ programozási nyelv BME-IIT Sz.I. 2019.02.12. - 12 -

Manipulatorok <iomanip> Hatás szempontjából 3 fajtájuk van: Azonnali hatás: cout << endl; // kiír egy \n -t és üríti a buffert cin >> ws; // eldobja az összes whitespcace-t csak a következő kiírásig érvénes cout << setw(4) << 3 << 4; // 34 a stream állapota tartósan megváltozik cout << setfill( 0 ) << setw(3) << 7 // 007 https://infocpp.iit.bme.hu/iomanip C++ programozási nyelv BME-IIT Sz.I. 2019.02.12. - 13 - Inline függvények (ism.) #define max(a,b) (a) < (b)? b : a x = 8, y = 1; z = max(x++, y++); x,y,z =? inline int max(int a, int b) { return(a < b? b : a); Úgy viselkedik, mint a függvény, de beépül. OK, de kell double-re, long-ra,... C++ programozási nyelv BME-IIT Sz.I. 2019.02.12. - 14-1. megoldási próbálkozás inline int max(int a, int b) { return(a < b? b : a); inline long max(long a, long b) { return(a < b? b : a); inline double max(double a, double b) { return(a < b? b : a); Az azonos nevekből nincs baj (túlterhelés), de fárasztó leírni minden típushoz. Lehet, hogy a makró mégis jobb? C++ programozási nyelv BME-IIT Sz.I. 2019.02.12. - 15 -

Megoldás: template nyelvi elem template <typename T> //korábban class typename inline T max(t a, T b) { return a < b? b : a; aktuális sablonparaméter formális sablonparaméter hatókör: a template kulcsszót követő deklaráció/definíció vége cout << max<long>(2, 10); cout << max<double>(2.5, 3.14); cout << max(40, 50); levezethető a paraméterekből C++ programozási nyelv BME-IIT Sz.I. 2019.02.12. - 16 - Mi a sablon? Parametrikus polimorfizmus. Típus biztos nyelvi elem az általánosításhoz. Gyártási forma: a sablonparaméterektől függően példányosítja a fordító (megírja a programot). Paraméter: típus, konstans, függvény, sablon Feldolgozása fordítási idejű ezért a példányosítás helyének és a sablonnak egy fordítási egységben kell lennie. gyakran header fájlba tesszük A példában függvénysablont láttunk, de később adatszerkezeteknél is használni fogjuk. C++ programozási nyelv BME-IIT Sz.I. 2019.02.12. - 17 - Mindeden típusra jó ez a max? template <typename T> T max(t a, T b) { // inline felesleges, mert... return a < b? b : a; cout << max(40, 50); cout << max( alma, korte ) // alma const char * Valóban a címeket akartuk összehasonlítani? strcmp kellene, de hogyan? Több megoldás van: 1. Összehasonlító függvény (predikátum) 2. Specializáció 3.... C++ programozási nyelv BME-IIT Sz.I. 2019.02.12. - 18 -

1. megoldás: összehasonlító fv. // max 3 paraméteres változata (overload) template <typename T, typename C> T max(t a, T b, C cmp) { return cmp(a, b)? b : a; Predikátum bool strless(const char *s1, const char *s2) { return strcmp(s1, s2) < 0; cout << max(40, 50); // 50 cout << max("alma", "korte", strless); // korte C++ programozási nyelv BME-IIT Sz.I. 2019.02.12. - 19-2. megoldás: Template specializáció // Teljes specilaizáció T::= const char* esetre template<> inline const char* max(const char* a, const char* b) { return strcmp(a,b) > 0? a : b; cout << max<long>(2, 10); // 10 cout << max<double>(1, 3.14); // 3.14 cout << max(40, 50); // 50 cout << max("alma", "korte"); // korte cout << max("ádám", "Béla"); // Ádám?? C++ programozási nyelv BME-IIT Sz.I. 2019.02.12. - 20 - Ékezettel C-ben is baj volt Egy betű egy karakter kódolásnál srcoll() fv. template<> const char* max(const char* a, const char* b) { return strcoll(a,b) < 0? b : a; cout << max("ádám", "Béla") << endl; // Béla git.ik.bme.hu/prog2/eloadas_peldak/ea_02/ -> template Egyéb kódolásnál (pl. UTF-8) a C string helyett valami mást érdemes használni, de majd később. C++ programozási nyelv BME-IIT Sz.I. 2019.02.12. - 21 -

Függvénysablon összefoglalás Függvények, algoritmusok általánosítási eszköze. Hatékony, paraméterezhető, újrafelhasználható, általános. Fordítási időben generálódó függvény. A példányosítás helyének és a sablonnak egy fordítási egységben kell lennie. Automatikusan inline-ként fordulhat. Függvény overload, default paraméterek ugyanúgy mint más függvényekkel. Sablon specializáció paraméter típustól függően más kód generálódik. Generikus programozás. C++ programozási nyelv BME-IIT Sz.I. 2019.02.12. - 22 - Predikátum Logikai függvény, ami egy algoritmus működését befolyásolja Pl.: válasszuk ki egy tömbből a leg... elemet! Melyik a leg? A predikátum függvény adja meg. template <typename T, typename S> T legelem(t a[], int n, S sel) { T tmp = a[0]; for (int i = 1; i < n; ++i) if (sel(a[i], tmp)) tmp = a[i]; return tmp; C++ programozási nyelv BME-IIT Sz.I. 2019.02.12. - 23 - Predikátum példa template <typename T, typename S> T legelem... // a predikátum is lehet template template <typename T> bool nagyobb_e(t a, T b) { return a > b; int tomb[] = { 1, 3, 4, 80, -21 ; cout << legelem(tomb, 5, nagyobb_e<int>); git.ik.bme.hu/prog2/eloadas_peldak/ea_02/ -> predicate C++ programozási nyelv BME-IIT Sz.I. 2019.02.12. - 24 -

Dinamikus memória C: #include <malloc.h>... struct Lanc *p; p = malloc(sizeof(lanc)); if (p == NULL)... free( p ); C++: Lanc *p; p = new Lanc;... delete p; Tömb: int *p; p = new int[10]; delete[] p; C++ programozási nyelv BME-IIT Sz.I. 2019.02.12. - 25 - Dinamikus memória /2 C: malloc(), free(), realloc() C++-ban is használható de csak nagyon körültekintően, ugyanis nem hívódik meg a megfelelő konstruktor ill. destruktor. Ezért inkább ne is használjuk. C++ (operátor): new, delete, new[], delete[] Figyeljünk oda, hogy a tömböket mindig a delete[] operátorral szabadítsuk fel. C++: nincs realloc()-nak megfelelő. C++ programozási nyelv BME-IIT Sz.I. 2019.02.12. - 26 - Példa: fordit_main.cpp #include <iostream> #include "szimpla_lanc.h" using std::cout; using std::cin; int main() { int i; Lanc_elem* kezdo = NULL; // üres lánc Számokat olvasunk be és fordított sorrendben kiírjuk. Láncban tárolunk. while (cin >> i) kezdo = lanc_epit(kezdo, i); cout << "Adatok forditott sorrendben:" << std::endl; lanc_kiir(cout, kezdo); lanc_felszabadit(kezdo); C++ programozási nyelv BME-IIT Sz.I. 2019.02.12. - 27 -

Példa: szimpla_lanc.h #ifndef SZIMPLA_LANC_H #define SZIMPLA_LANC_H #include <iostream> struct Lanc_elem { int adat; Lanc_elem* kov; ; Lanc_elem* lanc_epit(lanc_elem* p, int i); Struktúra név típussá vált Névteret nem nyitunk.h-ban! void lanc_kiir(std::ostream& os, const Lanc_elem* p); void lanc_felszabadit(lanc_elem* p); #endif // SZIMPLA_LANC_H C++ programozási nyelv BME-IIT Sz.I. 2019.02.12. - 28 - Példa: szimpla_lanc.cpp #include "szimpla_lanc.h" Lanc_elem* lanc_epit(lanc_elem* p, int a) { Lanc_elem *uj = new Lanc_elem; uj->adat = a; uj->kov = p; return uj; Vigyázat ez operátor! Nem szabad a malloc-ot formálisan lecserélni, mert mást jelent! C++ programozási nyelv BME-IIT Sz.I. 2019.02.12. - 29 - Példa: szimpla_lanc.cpp /2... void lanc_kiir(std::ostream& os, while (p!= NULL) { os << p->adat << ' '; p = p->kov; const Lanc_elem* p) { C++ programozási nyelv BME-IIT Sz.I. 2019.02.12. - 30 -

Példa: szimpla_lanc.cpp /3... void lanc_felszabadit(lanc_elem *p) { while (p!= NULL) { Lanc_elem *tmp = p->kov; delete p; p = tmp; git.ik.bme.hu/prog2/eloadas_peldak/ea_02/ -> fordít C++ programozási nyelv BME-IIT Sz.I. 2019.02.12. - 31 - Mi van, ha elfogy a memória? Két működési mód választható: 1. Hibakezelő mechanizmus indul be meghívódik a new_handler, ha van, egyébként bad_alloc kivétel generálódik 2. NULL pointerrel tér vissza Mai implementációkban az alapeset a kivételkezelés, ami manapság a hibakezelés szabványosnak tekinthető megoldása. C++ programozási nyelv BME-IIT Sz.I. 2019.02.12. - 32 - void outofmem() { cerr << "Gáz van\n"; exit(1); new_handler int main() { set_new_handler(outofmem); double p* = new double;... Kevésbé használt megoldás, de pl. garbage colletor-hoz használható. A visszatérésnek (return) akkor van értelme, ha ez a rutin képes területet felszabadítani. Különben végtelen ciklus. C++ programozási nyelv BME-IIT Sz.I. 2019.02.12. - 33 -

Kivételes esetek Gyakran hibakezelésnek mondjuk, de nem csak hiba lehet kivételes eset. Kivételes eset pl. amikor egy program először indul el az adott környezetben, és a további működéséhez... Alapvetően két kategóriába sorolhatók: végzetes, nem végzetes Kezelésük nagyon különböző nincs mit tenni, meg kell állni az eset ott helyben kezelhető az eset a program más részében kezelhető nem tudjuk, elhalasztjuk (másra bízzuk) a döntést. C++ programozási nyelv BME-IIT Sz.I. 2019.02.12. - 34 - Példák kivételes esetre printf függvényt nem a vssszatrési értéke miatt hívjuk, pedig a visszatérési értékében jelzi, hogy sikerült-e kiírni. Mit kell/lehet tenni? Pl: assert(printf( Hello Cicus ) >= 0); Egy erőforrás lefoglalása nem sikerül Mit kell/lehet tenni? Meg lehet próbálni később C++ programozási nyelv BME-IIT Sz.I. 2019.02.12. - 35 - Példák kivételes esetre /2 Adott nyelvhez (természetes) tartózó üzenetek állománya nem található. Mit kell/lehet tenni? Pl: Meg lehet próbálni másik nyelvet Másodfokú egyenletnek nincs valós megoldása. Mit kell/lehet tenni? Jelezni kell a függvényt hívónak C++ programozási nyelv BME-IIT Sz.I. 2019.02.12. - 36 -

Kivételes esetek kezelése, jelzése Kinek kell jelezni? felhasználó, másik programozó, másik program saját magunknak A kivételes eset kezelése gyakran nem annak keletkezési helyén történik. (Legtöbbször nem tudjuk, hogy mit kell tenni. Megállni, kiírni valami csúnyát, stb.) C++ programozási nyelv BME-IIT Sz.I. 2019.02.12. - 37 - Kivétel kezelés C++ típus orientált kivételkezelést támogat, amivel a kivételes esetek kezelésének szinte minden formája megvalósítható. A kivételkezeléshez tartozó tevékenységek: figyelendő kódrészlet kijelölése (try) kivétel továbbítása (throw) esemény lekezelése (catch) C++ programozási nyelv BME-IIT Sz.I. 2019.02.12. - 38 - Kivételkezelés = globális goto try Fv. Kivételes eset: throw A Felügyelt műveletek beleértve az innen hívott függvényeket is. catch Kivétel elkapása, típus alapján, és kezelése. Kivételes eset: throw B C: setjmp( ) longjmp( ) További műv. A: A típusú érték B: B típusú érték C++ programozási nyelv BME-IIT Sz.I. 2019.02.12. - 39 -

try { Kivételkezelés/2... Kritikus művelet1 pl. egy függvény hívása, aminek a belsejében: if (hiba) throw kifejezés_tipus1;... Kritikus művelet2 pl. egy másik függvény hívása, aminek a belsejében: if (hiba) throw kifejezés_tipus2; catch (típus1 param) {... Kivételkezelés1 catch (típus2 param) {... Kivételkezelés2 A hiba tetszőleges mélységben keletkezhet. Közvetlenül a try-catch blokkban a throw-nak nincs sok értelme, hiszen akkor már kezelni is tudnánk a hibát. C++ programozási nyelv BME-IIT Sz.I. 2019.02.12. - 40 - Kivételkezelés példa Hiba/kivétel észlelése Felügyelt szakasz. Ennek a működése során fordulhat elő a kivételes eset. double osztas(int y) { if (y == 0) throw "Osztas nullaval"; return((5.0/y); int main() { try { cout << "5/2 =" << osztas(2) << endl; cout << "5/0 =" << osztas(0) << endl; catch (const char *p) { cout << p << endl; A kivételt azonosító érték eldobása. Típus azonosít (köt össze). Kivétel elkapása és kezelése. C++ programozási nyelv BME-IIT Sz.I. 2019.02.12. - 41 - Kivételkezelés a memóriára #include <iostream> using std::cerr; A kivételes eset int main() { itt keletkezhet. long db = 0; try { while(true) { double *p = new double[1022]; db++; catch (std::bad_alloc) { Kivétel elkapása cerr << "Gaz van" << endl; és kezelése. cerr << "Ennyi new sikerult:" << db << endl; C++ programozási nyelv BME-IIT Sz.I. 2019.02.12. - 42 -

Futási példa az ural2-n ural2:~$ cp ~szebi/proga2/mem_alloc.cpp. ural2:~$ g++ -static mem_alloc.cpp -o mem_alloc ural2:~$ ( ulimit -d 24;./mem_alloc ) # A static azért kell, hogy a betöltésnél ne legyen szükség # extra loader-re, ami extra memóriát használ. # A zárójel azért kell, hogy új shell induljon. C++ programozási nyelv BME-IIT Sz.I. 2019.02.12. - 43 - Futási példa az ural2-n /2 Az ural2-n levő kóddal a new_handler működése is tesztelhető. Ehhez a fordításkor definiálni kell a HANDLER azonosítót: ural2:~$ g++ -static mem_alloc.cpp DHANDLER -o mem_alloc ural2:~$ ( ulimit -d 24;./mem_alloc ) C++ programozási nyelv BME-IIT Sz.I. 2019.02.12. - 44 -