HTML

C++ programozás

Főként C++ programozásról, de lehet szó még C#, D vagy más nyelvről is.

Friss topikok

  • tormanator: A CG-shaderben megírt raytracing 106x gyorsabb, mint egy SSE-utaításokkal futó raytracing. Mindeg... (2011.09.08. 07:00) Csak párhuzamosan!
  • koszperv: @Vorbis: Szia! Köszöntlek, mint a blogom első hozzászólóját. Az enum egyébként tényleg egész haszn... (2009.12.30. 11:44) const vs define

Linkblog

2010.01.19. 08:31 koszperv

Uniquum

Az auto_ptr valódi unikum volt az STL template-ek között, hiszen senki mással nem volt hajlandó együttműködni. Funkciója az volt, hogy bele lehessen rakni egy pointert, és ő meghívja a delete-et rá, ha meghívódik a saját destruktora. Ezért aztán copy-funkciót nem raktak bele, csak move-ot, mivel ha két auto_ptr-ben is szerepelne ugyanaz a pointer, akkor azt duplán törölnék. A heapen tárolt objektum lemásolása pedig elütött a szerepétől. Így úgy gondolták, a move-szemantikát, lévén, hogy akkor még nem létezett rvalue referencia, a copy construktorral és a copy assignment operátorral oldják meg. Ez azonban azt eredményezte, hogy ha berakták egy vectorba, akkor a vector újrafoglalása rendben működött, de egy másik vectorba már nem lehetett áttölteni. Emiatt letiltották a használatát a konténerekben. Viszont továbbra is remekül lehetett használni lokális változókban RAII-nak, és biztonságos pointereknek tagváltozókba.

Most viszont már meg lehet különböztetni a copy és a move szemantikát az rvalue referenciák segítségével. Ezért hozták létre a unique_ptr-t, ami átveszi a szerepét. Sajnos az auto_ptr-t nem lehetett kijavítani, mert az a copy konstruktorban és a copy assignment operátorban végezte a move-szemantikáját, és ha ezt átírják move konstruktorra és move assignment operátorra, akkor sok program nem futna többé. A unique_ptr nem tud másolódni, viszont move-olódni igen. Ezért ha berakjuk a vectorba, és azt megpróbáljuk lemásolni egy másik vectorba, kapunk egy hosszú és érthetetlen hibaüzenetet, melynek lényege, hogy pár függvény implementációja hiányzik a template-ből. Viszont ha nem akarjuk másolni, egy vectoron belül jól megvan. A helyes használata egy vectorral így néz ki:

    for (int i = 0; i < 10000; ++i)
    {
        unique_ptr<Obj> o(new Obj());
        v.push_back(move(o));
    }
Figyeljünk arra, hogy a move függvényt itt is használnunk kell, mert egyébként nem tudná, hogy move-olni akarjuk, és hibaüzenetet adna.

Így a unique_ptr lett az új auto_ptr, annyira, hogy az auto_ptr-t deprecateddé tették. Vagyis a jövőben célszerű lesz átírni régebbi kódjainkban is az auto_ptr-unique_ptr-re.

 

Szólj hozzá!

A bejegyzés trackback címe:

https://progcpp.blog.hu/api/trackback/id/tr91683918

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Nincsenek hozzászólások.
süti beállítások módosítása