Smart Pointer koncepciója

Hasonló dokumentumok
C++ programozási nyelv

Programozás C++ -ban

C++ programozási nyelv Konstruktorok-destruktorok

Bevezetés a Python programozási nyelvbe

Programozás C++ -ban 2007/7

Java és web programozás

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

Miután létrehoztuk, szeretnénk neki beszédesebb nevet adni. A név változtatásához a következőt kell tenni:

Osztályok. 4. gyakorlat

ELTE SAP Excellence Center Oktatóanyag 1

OOP #14 (referencia-elv)

1. Mi a fejállományok szerepe C és C++ nyelvben és hogyan használjuk őket? 2. Milyen alapvető változókat használhatunk a C és C++ nyelvben?

OOP #7 (init, done) v :45:00. Eszterházy Károly Főiskola Információtechnológia tsz. Hernyák Zoltán adj.

Pelda öröklődésre: import java.io.*; import java.text.*; import java.util.*; import extra.*;

Objektumok inicializálása

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

3. Osztályok II. Programozás II

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

7. fejezet: Mutatók és tömbök

Java és web programozás

A C++ öröklés. (Előfeltétel: 12. tétel ismerete)

Programozási nyelvek Java

Dokumentáció. 1. Beadandó feladat

Számítógép és programozás 2

Programozás C++ -ban

Programozás. Osztályok, Származtatott osztályok. Fodor Attila

Dr. Pál László, Sapientia EMTE, Csíkszereda WEB PROGRAMOZÁS 2.ELŐADÁS. Objektumorientált programozás

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.

Java és web programozás

Pénzügyi algoritmusok

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

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

C++ Gyakorlat jegyzet 5. óra. A C++ szabvány több memóriatípust különít el. Ezek közül elsősorban a stack-et használtuk eddig.

Programozás módszertan

500. AA Megoldó Alfréd AA 500.

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

Számítástechnika II. BMEKOKAA Előadás. Dr. Bécsi Tamás

Java programozási nyelv 4. rész Osztályok II.

Programozás C++ -ban 2007/4

OOP. Alapelvek Elek Tibor

Mutatók és mutató-aritmetika C-ben március 19.

Algoritmusok és adatszerkezetek gyakorlat 06 Adatszerkezetek

Bevezetés a programozásba Előadás: Tagfüggvények, osztály, objektum

Java III. I I. Osztálydefiníció (Bevezetés)

C# Nyelvi Elemei. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) C# Nyelvi Elemei / 18

JAVA PROGRAMOZÁS 2.ELŐADÁS

Java III. I I. Osztálydefiníció (Bevezetés)

8. gyakorlat Pointerek, dinamikus memóriakezelés

Objektum orientált kiterjesztés A+ programozási nyelvhez

Eseménykezelés. Szoftvertervezés és -fejlesztés II. előadás. Szénási Sándor.

Széchenyi István Egyetem. Programozás III. Varjasi Norbert

ELTE SAP EXCELLENCE CENTER Oktatóanyag. Sas László: ABAP Objects Objektumorientált ABAP

A gyakorlat során MySQL adatbázis szerver és a böngészőben futó phpmyadmin használata javasolt. A gyakorlat során a következőket fogjuk gyakorolni:

Vizuális, eseményvezérelt programozás X. V 1.0

C programozási nyelv Pointerek, tömbök, pointer aritmetika

C++ programozási nyelv Konstruktorok Gyakorlat

Kommunikáció. Folyamatok közötti kommunikáció. Minden elosztott rendszer alapja

Objektumelvű alkalmazások fejlesztése 6. gyakorlat. Öröklődés, polimorfizmus. Öröklődés Kódismétlődés objektum-orientált szerkezetben

Rendszerterv. Makoviczki András. Neptun: JJ26AR

C++ programozási nyelv

Virtuális függvények (late binding)

AA MEGOLDÓ ALADÁR AA

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) {} };

Adatszerkezetek 2. Dr. Iványi Péter

500. CC Megoldó Alfréd CC 500.

C++ referencia. Izsó Tamás február 17. A C++ nyelvben nagyon sok félreértés van a referenciával kapcsolatban. A Legyakoribb hibák:

Mi a különbség az extends és az implements között. Mikor melyiket kell használni? Comperable-t megvalósító oasztályokban össze lehet hasonlitani

Bevezetés, a C++ osztályok. Pere László





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

1. Öröklés Rétegelés Nyilvános öröklés - isa reláció Korlátozó öröklődés - has-a reláció

Programozási nyelvek Java

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

és az instanceof operátor

Programozási nyelvek II.: JAVA

Java VIII. Az interfacei. és az instanceof operátor. Az interfészről általában. Interfészek JAVA-ban. Krizsán Zoltán

OOP: Java 11.Gy: Enumok, beágyazott osztályok. 13/1 B ITv: MAN

- 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]++;

Se S r e ial a iza z t a ion o n (in n Ja J v a a v ) a Szerializáció

ISA szimulátor objektum-orientált modell (C++)

Osztályok. construct () destruct() $b=new Book(); $b=null; unset ($b); book.php: <?php class Book { private $isbn; public $title;

Kivételkezelés, beágyazott osztályok. Nyolcadik gyakorlat

C++ Gyakorlat jegyzet 5. óra. A C++ szabvány több memóriatípust különít el. Ezek közül elsősorban a stack-et használtuk eddig.

OOP alapok Egy OOP nyelvet három fontos dolog jellemez. egységbezárás ( encapsulation objektumoknak öröklés ( inheritance

Programozás 2. gyakorlat

Óbudai Egyetem. C programozási nyelv

Szoftvertechnolo gia gyakorlat

Szemétgyűjtés DotNET módra

Elemi Alkalmazások Fejlesztése II.

Operációs rendszerek. UNIX/Linux fájlrendszerek

Alkalmazott modul: Programozás 8. előadás. Strukturált programozás: dinamikus memóriakezelés. Dinamikus memóriakezelés. Dinamikus memóriakezelés

Programozás BMEKOKAA146. Dr. Bécsi Tamás 7. előadás

Alkalmazott modul: Programozás 10. fejezet. Strukturált programozás: dinamikus memóriakezelés. Giachetta Roberto

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

Már megismert fogalmak áttekintése

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

Programozási nyelvek Java

Átírás:

Smart Pointer koncepciója ( Egyszerű Smart Pointer implementálása C++ nyelven ) Bevezetés Mik a smart pointer-ek 1? A válasz egyszerű; a smart pointer-ek olyan mutatók amik okosak. Mit is jelent ez pontosan? Igazából a smart pointer-ek olyan objektumok amik pointer-ek extrákkal. Ezek az objektumok rugalmasak mint egy pointer és rendelkeznek az objektumok előnyeivel (pl.: konstruktor, destruktor hívás automatikusan). A smart pointer célja, hogy kezelje azokat a hibákat amiket az alapvető pointer-ek okoznak. (Innen jött az okos jelző) Problémák a pointer-ekkel Mik azok a gyakori problémák amikkel találkozunk miközben C++ pointer-eket használunk? A válasz, memória kezelés. Vessünk egy pillantást erre a kódra: Hányszor fordult elő, az a hiba, hogy elfelejtettük törölni a pname-t? Jó lenne ha valaki gondoskodna a memória felszabadításról, amikor a pointer már nincs használatban (most nem a garbage collector 2 - ra gondolok). Mi lenne ha pointer magától gondoskodna erről a problémáról? Pontosan erre lett megalkotva a smart pointer. Írjunk egy smart pointer osztályt és nézzük meg, hogy tudjuk vele kezelni a pointer-eket. 1.) Smart pointer jelentése okos mutatók, későbbiekben az angol nevét fogom használni 2.) Garbage Collector azaz szemétgyűjtő, például a JAVA nyelv használja

Kezdjük egy valósághű problémával, mondjuk legyen egy Személy osztály ami a következőképp van meghatározva: Nézzük meg ezt a kódot, minden egyes alkalommal amikor létrehozunk egy pointer-t akkor törölnünk is kell azt. Pontosan ezt szeretném elkerülni, kell valami automatikus eljárás ami törli a pointer-t. Ami azonnal eszembe jut az a destruktor, de a pointereknek nincs destruktora, mi legyen? A mi smart pointer-ünknek viszont van, tehát készítünk egy osztályt, legyen a neve SP ami tárolhat egy pointer-t a Személy osztályunkra, így törölni fogja a pointer-t amikor a destruktor meghívódik. Valahogy így: Vegyük észre a következőket: - Létrehoztunk egy objektumot az SP osztályból ami tárolja a mi Személy osztály pointerünket. Most a desktruktor az SP osztálynak meg fog hívódni amikor az objektumunk elhagyja hatáskörét, így törölni fogja a Személy típusú pointer-t; szóval nincs fájdalmas pointer törlés. - Még egy dolog nagyon fontos, ugyanúgy tudjuk meghívni a Mutat() eljárást (miközben az SP osztály objektumát használjuk) mint ahogy eredetileg 3 azaz az osztály pontosan pointer-ként fog viselkedni 3.) -> operátor a. operátor helyett

Interfész smart pointer-hez Mivel a smart pointer-nek pointer-ként kell viselkednie ezért tudnia kell mindent amit egy pointer tud. PL.: a következő operátorokat felül kell definiálni: - Csillag operátor (operator * dereferálás) - Indirection (operator ->) Írjuk meg az SP osztályt: Ez az osztály a mi smart pointer osztályunk. A fő célja ennek az osztálynak, hogy tároljon egy pointer-t a Személy osztályról és törölje azt amikor a desktruktor meghívódik miközben tudja mindazt amit egy pointernek tudnia kell. Generikus smart pointer Egy problémánk akad amit azonnal ki lehet szúrni ezt a smart pointer-t csak a Személy osztályra lehet alkalmazni. Ez azt jelenti, hogy minden egyes osztálynak és/vagy típusnak külön meg kellene írni a smart pointer osztályt és az nem egyszerű. De szerencsénkre segítségünkre vannak a templateek, így generikussá tudjuk tenni az osztályunkat, tegyük is meg: Most már rá tudjuk húzni bármely osztályra a smart pointer-ünk. Nézzük, meg hogy a smart pointerünk tényleg olyan okos-e mint gondoljuk

Nézzük mi történik itt, p és q ugyanarra a Személy osztálybeli pointer-re referál. Most, hogy q ki megy a hatókörből; q destruktor-a meg fog hívódni ami törli a Személy osztály pointer-t. Így nem tudjuk meghívni p->mutat(); mert p egy Dangling pointer 4 lesz, így itt hiba keletkezik. (Megj.: ez a hiba akkor is felmerült volna ha normál pointer-t használunk smart pointer helyett). Addig nem szabad törölni a Személy osztály pointer-t amíg valaki használja. Hogy is kéne ezt megoldani? Implementáljunk egy referencia számláló mechanizmust a smart pointer osztályunkba és ez meg fogja oldani a problémát. 4.) Dangling pointer: olyan pointer ami olyan területre mutat ami törölve lett.

Referencia számlálás Most pedig készítünk egy referencia számláló osztályt nevezzük RC nek. Ez az osztály fenntart egy egész típusú értéket ami a referencia számot fogja reprezentálni. Legyenek metódusaink amik növelik és csökkentik ezt a referencia számot. Most, hogy van egy referencia számláló osztályunk vezessük be a smart pointer osztályunkba. Fenntartunk egy RC pointer-t ami az ami megosztozik az összes példányon ami ugyanarra a pointer-re referál. Ahhoz, hogy ez megtörténjen felül kell definiálni az értékadó operátort és a Copy Konstruktor-t is az SP osztályunkban.

Amikor létrehozunk egy Szemely típusú smart pointer-t p néven, az SP konstruktora fog meghívódni az adatok el lesznek tárolva és egy új RC pointer is létre fog jönni. Az AddRef() metódusa az RC-nek meghívódik és megnöveli egyre a referencia számlálót. Most SP q = p; helyen létre jön egy új smart pointer q néven a Copy konstruktor által. Itt az adatok át fognak másolódni és a referencia megint megnövelődik, így már 2 lesz az értéke. Most r = p; meghívja az értékadó operátort és hozzá rendeli p értéket q-hoz. Itt ismét másolódnak az adatok így a referencia számláló 3-ra növekszik. Amikor r és q elhagyja a hatókört, a megfelelő objektumok destruktor-ai meg fognak hívódni. Itt még a referencia számlálók fognak csak csökkeni és az adatok nem fognak törlődni, hacsak a referencia számláló nem 0. Innentől az adatunk csak akkor fog törlődni ha már senki nem fog referálni rá. Folytatás hamarosan Példa program letölthető itt: http://people.inf.elte.hu/kabuabi/sp_sample.zip