C ++ shared_ptr

C Shared_ptr



Az shared_ptr a C ++ intelligens mutatóinak egyik típusa, amely tartalmazza a mutató által létrehozott objektum megosztott tulajdonjogát. Megosztja az objektum tulajdonjogát, amikor a mutatót egy másik objektumba tárolja, és a megosztott hivatkozásszámláló számolja a tulajdonosok számát. Az shared_ptr eggyel növeli a referenciaszámlálót az objektum másolása után, és eggyel csökkenti a referenciaszámlálót az objektum megsemmisítése után. Az objektum tulajdonában lévő memória újraelosztásra kerül, ha az objektum az utolsó tulajdonában van shared_ptr megsemmisül, vagy a Visszaállítás() függvényt hívják meg, hogy másik mutatót rendeljen az objektumhoz. Amikor az shared_ptr nem rendelkezik objektummal, akkor üres megosztott mutatónak nevezzük. A különböző felhasználási módok shared_ptr jelentek meg ebben az oktatóanyagban.

1. példa: A megosztott mutató deklarálása különböző módokon

A megosztott mutató deklarálásának három különböző módja látható a következő példában. A kódban deklarált egy konstruktorral és nyilvános metódussal rendelkező osztály. A konstruktor üzenetet nyomtat, amikor új megosztott objektum jön létre a konstruktorral. Az Kijelző() metódus az üzeneteket a hívó megosztott mutatóobjektum alapján nyomtatja ki. Itt jött létre az első megosztott mutatóobjektum a konstruktor meghívása nélkül. A második megosztott mutatóobjektumot a konstruktor hívásával hozták létre. A harmadik megosztott mutató az első megosztott mutató hozzárendelésével jött létre. Az Kijelző() metódust háromszor hívták meg három megosztott mutatóobjektum használatával.







// Tartalmazza a szükséges könyvtárakat

#befoglalni

#befoglalni

usingnamespacestd;

// Határozza meg az osztályt
classMyClass{
nyilvános:
// Nyilatkozzon a konstruktőrről
Az osztályom() {
költség<<- A konstruktőrt hívják. n';
}
// A szöveg nyomtatási módszerének deklarálása
voidDisplay(string str)
{
költség<<'A Display () metódust a'<<o<<'mutató. n';
}
};

intmain()
{
// A shared_ptr inicializálása a konstruktor meghívása nélkül
shared_ptr p1=make_shared();
p1->Kijelző('első');
// A shared_ptr inicializálása a konstruktor hívásával
shared_ptr p2=shared_ptr(newMyClass);
p2->Kijelző('második');

// A shared_ptr inicializálása hozzárendeléssel
shared_ptr 3. oldal=p1;
p3->Kijelző('harmadik');
visszatérés0;
}

Kimenet:



A fenti kód végrehajtása után a következő kimenet jelenik meg. A konstruktor csak a második objektum létrehozásakor hívott. Tehát a konstruktor üzenete csak egyszer lett kinyomtatva:







2. példa: Nyomtassa ki a tárolt megosztott mutató helyét

A get () függvény megosztott mutatója a tárolt, megosztott mutató helyének visszaadására szolgál. A következő példa kinyomtatja az osztály és a függvény által létrehozott tárolt, megosztott mutatók helyét. Itt egy konstruktorral rendelkező osztályt definiáltak egy megosztott mutató létrehozásához. A függvény bejelentette, hogy létrehoz egy megosztott mutatót, és kinyomtatja a megosztott mutató helyét a get () függvénnyel. Ebben a kódban az első megosztott mutatót az osztály használatával hozták létre, a második megosztott mutatót a függvény használatával, a harmadik megosztott mutatót pedig az első mutató hozzárendelésével hozták létre.

// Tartalmazza a szükséges könyvtárakat

#befoglalni

#befoglalni

usingnamespacestd;

// Határozza meg az osztályt
classMyClass
{
nyilvános:
// Nyilatkozzon a konstruktőrről
Az osztályom() {
költség<<- A konstruktőrt hívják. n';
}
};
// Határozza meg a mutató inicializálására szolgáló funkciót
voidInit_shared_ptr()
{
shared_ptr p2(newMyClass);
költség<<p2.kap() <<' n';
}

intmain()
{
// A shared_ptr inicializálása a konstruktor hívásával
shared_ptr p1=shared_ptr(newMyClass);
költség<<p1.kap() <<' n';

// A shared_ptr inicializálása a függvény hívásával
Init_shared_ptr();

// A shared_ptr inicializálása hozzárendeléssel
shared_ptr 3. oldal=p1;
költség<<p3.kap() <<' n';
visszatérés0;
}

Kimenet:



A következő hasonló kimenet jelenik meg a fenti kód végrehajtása után. A kimenetben a get () függvény visszaadott értéke az első és a harmadik megosztott mutató esetében azonos. A második megosztott mutató azonban más:

3. példa: Számolja meg a megosztott mutatóobjektumokat

A következő példa bemutatja a megosztott mutató által mutatott objektumok számolásának módját a mutató létrehozása és megsemmisítése után. A kódban deklarált egy konstruktorral rendelkező osztály. Az első megosztott mutató az osztály használatával jött létre, a második pedig az első megosztott mutatóval. A mindkét megosztott mutató által a reset () függvény meghívása előtt és után mutatott objektumok száma később került kinyomtatásra.

// Tartalmazza a szükséges könyvtárakat

#befoglalni

#befoglalni

usingnamespacestd;
// Határozza meg az osztályt
classMyClass{
nyilvános:
// Nyilatkozzon a konstruktőrről
Az osztályom() {
költség<<- A konstruktőrt hívják. n';
}
};
intmain()
{
// Inicializálja az első shared_ptr -t a konstruktor hívásával
shared_ptr p1(newMyClass);

// A shared_ptr objektumok számának megjelenítése az első mutató alapján
költség<<'p1 mutat'<<p1.use_count() <<'tárgy (ok). n';
// Inicializálja a második shared_ptr -t az első shared_ptr használatával
shared_ptr p2(p1);
// A shared_ptr objektumok számának megjelenítése az első és a második mutató szerint
költség<<'p2 rámutat'<<p2.use_count() <<'tárgy (ok). n';
költség<<'p1 mutat'<<p1.use_count() <<'tárgy (ok). n';
// Az első mutató tulajdonjogának eltávolítása a shared_ptr objektumból
p1.Visszaállítás();
// A shared_ptr objektumok számának megjelenítése a második mutatóval
költség<<'p2 rámutat'<<p2.use_count() <<'tárgy (ok). n';
visszatérés0;
}

Kimenet:

A fenti kód végrehajtása után a következő kimenet jelenik meg. Az első mutató, p1 , létrehozás után egy objektumra mutat. A második mutató létrehozása után p2 , az első mutató használatával, p1 , mindkét mutató két objektumra mutat a mutató megosztása érdekében. Miután meghívta a mutató reset () függvényét, p1 , egy tárgy megsemmisült, és a mutató, p2 , most csak egy objektumra mutat.

Következtetés:

A C ++ nyelvű megosztott mutató használatának céljait ebben az oktatóanyagban egyszerű példákkal ismertettük. Megosztott mutatók létrehozása különböző módokon, tárolt megosztott mutató helyének lekérése és a megosztott mutatók által mutatott objektumok számának számítása. Remélem, hogy a C ++ kódolók az oktatóanyag elolvasása után képesek lesznek használni a megosztott mutatót a kódjukban.