Kezdőoldal » Számítástechnika » Programozás » Miben különbözik C++-ban a...

Miben különbözik C++-ban a shared pointer működése . NET-es memória menedzseléstől?

Figyelt kérdés
2017. jan. 9. 20:09
 1/3 anonim ***** válasza:

A C++-t nem ismerem, szóval inkább a .NET-ről mesélnék.


Amikor létrejön egy objektum, a .NET ehhez hozzárendel egy számot (ezt hívjuk referenciaszámlálónak). Ez a szám azt jelenti, hogy hány programozási eszköz hivatkozik arra az objektumra. Nézzünk egy egyszerű forráskódot:


[C#]

object a = new object();

object b = a;

b = null;

a = null;


Először kiértékelődik a new object() példányosító kifejezés. Ez - mivel reference-type - a heap-en létrejön, és a .NET beállítja a a referenciaszámláló értékét 0-ra.


Ezt követően kiértékelődik az object a = [az előbb kiértékelt kifejezés object típusú eredménye] értékadó kifejezés. Ennek hatására a .NET az objektum referenciaszámlálóját 1-re módosítja.


Majd kiértékelődik az object b = a kifejezés. Mivel egy újabb hivatkozás van a korábban létrehozott objektumra, szintén megnöveli a referenciaszámlálót, aminek az értéke 2 lesz.


Most a b = null értékadás értékelődik ki. Mivel eggyel kevesebb eszköz hivatkozik az objektumunkra, a .NET a referenciaszámlálót csökkenti 2-ről 1-re.


Ezt követően az a = 0 jön. Az előzőhöz hasonlóan csökken a referenciaszámláló értéke eggyel, azaz az új értéke 0 lesz. Ezzel elveszítettük minden "kapcsolatunkat" a létrehozott objektummal, amit már soha nem fogunk tudni visszakapni. És itt jön a képbe a GC (garbage collector).


A GC időnként (pontosabban "amikor neki jól esik" - akarom mondani, nem tudjuk megmondani, mikor fog aktivizálódni) végignézi a program futása során létrejött objektumokat és megkeresi azokat, amelyeknek a referenciaszámlálója nullán áll és törli őket (persze ha van destruktora az objektumnak, előbb azt végrehajtja).


Bár lehetőségünk van a .NET-től "kérni" a GC futtatását a GC.Collect() meghívásával, de ennek hatására sem lehetünk abban biztosak, hogy a GC-nek "mikor lesz kedve" lefutni.

2017. jan. 9. 20:59
Hasznos számodra ez a válasz?
 2/3 A kérdező kommentje:

A .net-et eddig is valahogy így képzeltem, de köszönöm, hogy konkretizáltál számomra néhány dolgot.


Gondolom a shared pointer objektuma c++-ban önmaga tartja számon, hogy hány helyen hivatkoznak rá és nincs külön garbage collector.

2017. jan. 9. 22:04
 3/3 anonim ***** válasza:
2017. jan. 9. 22:30
Hasznos számodra ez a válasz?

Kapcsolódó kérdések:




Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!