C ++ shared_ptr

C Shared_ptr



The shared_ptr je jeden typ inteligentních ukazatelů C ++, který obsahuje sdílené vlastnictví objektu vytvořeného ukazatelem. Při ukládání ukazatele do jiného objektu sdílí vlastnictví objektu a počítadlo sdílených odkazů počítá počet vlastníků. The shared_ptr zvýší referenční čítač o jeden po zkopírování objektu a sníží referenční čítač o jeden po zničení objektu. Paměť ve vlastnictví objektu je přerozdělena, pokud je objekt ve vlastnictví posledního shared_ptr je zničen, nebo resetovat () funkce je volána k přiřazení dalšího ukazatele objektu. Když shared_ptr nevlastní žádný objekt, pak se tomu říká prázdný sdílený ukazatel. Různá použití shared_ptr byly ukázány v tomto tutoriálu.

Příklad 1: Deklarujte sdílený ukazatel různými způsoby

V následujícím příkladu jsou uvedeny tři různé způsoby, jak deklarovat sdílený ukazatel. V kódu byla deklarována třída s konstruktorem a veřejnou metodou. Konstruktor vytiskne zprávu, když je pomocí konstruktoru vytvořen nový sdílený objekt. The Zobrazit() metoda vytiskne zprávy na základě volání objektu sdíleného ukazatele. Zde byl vytvořen první objekt sdíleného ukazatele bez volání konstruktoru. Druhý objekt sdíleného ukazatele byl vytvořen voláním konstruktoru. Třetí sdílený ukazatel byl vytvořen přiřazením prvního sdíleného ukazatele. The Zobrazit() metoda byla volána třikrát pomocí tří sdílených objektů ukazatele.







// Zahrňte potřebné knihovny

#zahrnout

#zahrnout

usingnamespacestd;

// Definujte třídu
classMyClass{
veřejnost:
// Deklarujte konstruktor
Moje třída() {
náklady<<'Konstruktor se nazývá.' n';
}
// Deklarace metody tisku textu
voidDisplay(řetězec str)
{
náklady<<'Metoda Display () se nazývá z'<<p<<'ukazatel. n';
}
};

intmain()
{
// Inicializujte shared_ptr bez volání konstruktoru
shared_ptr p1=make_shared();
p1->Zobrazit('za prvé');
// Inicializujte shared_ptr voláním konstruktoru
shared_ptr p2=shared_ptr(newMyClass);
p2->Zobrazit('druhý');

// Inicializujte shared_ptr přiřazením
shared_ptr p3=p1;
p3->Zobrazit('Třetí');
návrat0;
}

Výstup:



Po spuštění výše uvedeného kódu se zobrazí následující výstup. Konstruktor zavolal pouze v době vytvoření druhého objektu. Zpráva konstruktoru byla tedy vytištěna pouze jednou:







Příklad 2: Vytiskněte umístění uloženého sdíleného ukazatele

Sdílený ukazatel funkce get () se používá k vrácení uloženého, ​​sdíleného umístění ukazatele. Následující příklad vytiskne umístění uložených, sdílených ukazatelů, které jsou vytvořeny třídou a funkcí. Zde byla definována třída s konstruktorem, která má být použita pro vytvoření sdíleného ukazatele. Byla deklarována funkce pro vytvoření sdíleného ukazatele a tisk umístění sdíleného ukazatele pomocí funkce get (). V tomto kódu byl první sdílený ukazatel vytvořen pomocí třídy, druhý sdílený ukazatel byl vytvořen pomocí funkce a třetí sdílený ukazatel byl vytvořen přiřazením prvního ukazatele.

// Zahrňte potřebné knihovny

#zahrnout

#zahrnout

usingnamespacestd;

// Definujte třídu
classMyClass
{
veřejnost:
// Deklarujte konstruktor
Moje třída() {
náklady<<'Konstruktor se nazývá.' n';
}
};
// Definování funkce pro inicializaci ukazatele
voidInit_shared_ptr()
{
shared_ptr p2(newMyClass);
náklady<<p2.dostat() <<' n';
}

intmain()
{
// Inicializujte shared_ptr voláním konstruktoru
shared_ptr p1=shared_ptr(newMyClass);
náklady<<p1.dostat() <<' n';

// Inicializujte shared_ptr voláním funkce
Init_shared_ptr();

// Inicializujte shared_ptr přiřazením
shared_ptr p3=p1;
náklady<<p3.dostat() <<' n';
návrat0;
}

Výstup:



Následující podobný výstup se objeví po provedení výše uvedeného kódu. Ve výstupu je vrácená hodnota funkce get () pro první a třetí sdílené ukazatele stejná. Druhý sdílený ukazatel je však jiný:

Příklad 3: Počítejte objekty sdíleného ukazatele

Následující příklad ukazuje způsob, jak počítat počet objektů, na které ukazuje sdílený ukazatel, po vytvoření a zničení ukazatele. V kódu byla deklarována třída s konstruktorem. První sdílený ukazatel byl vytvořen pomocí třídy a druhý sdílený ukazatel byl vytvořen pomocí prvního sdíleného ukazatele. Počet objektů, na které ukazovaly obě sdílené ukazatele před a po volání funkce reset (), byl vytištěn později.

// Zahrňte potřebné knihovny

#zahrnout

#zahrnout

usingnamespacestd;
// Definujte třídu
classMyClass{
veřejnost:
// Deklarujte konstruktor
Moje třída() {
náklady<<'Konstruktor se nazývá.' n';
}
};
intmain()
{
// Inicializujte první shared_ptr voláním konstruktoru
shared_ptr p1(newMyClass);

// Zobrazí počet objektů shared_ptr podle prvního ukazatele
náklady<<'p1 ukazuje na'<<p1.use_count() <<'předmět (y). n';
// Inicializujte druhý shared_ptr pomocí prvního shared_ptr
shared_ptr p2(p1);
// Zobrazení počtu shared_ptr objektů podle prvního a druhého ukazatele
náklady<<'p2 ukazuje na'<<p2.use_count() <<'předmět (y). n';
náklady<<'p1 ukazuje na'<<p1.use_count() <<'předmět (y). n';
// Odebere vlastnictví prvního ukazatele z objektu shared_ptr
p1.resetovat();
// Zobrazí počet objektů shared_ptr podle druhého ukazatele
náklady<<'p2 ukazuje na'<<p2.use_count() <<'předmět (y). n';
návrat0;
}

Výstup:

Po spuštění výše uvedeného kódu se zobrazí následující výstup. První ukazatel, p1 , ukazuje na jeden objekt po vytvoření. Po vytvoření druhého ukazatele p2 pomocí prvního ukazatele, p1 , oba ukazatele ukazují na dva objekty pro sdílení ukazatele. Po volání funkce reset () pro ukazatel p1 jeden objekt byl zničen a ukazatel, p2 , nyní ukazuje pouze na jeden objekt.

Závěr:

Účely použití sdíleného ukazatele v C ++ byly v tomto kurzu vysvětleny pomocí jednoduchých příkladů. Vytváření sdílených ukazatelů různými způsoby, získávání uloženého umístění sdíleného ukazatele a počítání počtu objektů, na které ukazují sdílené ukazatele. Doufám, že kodéry C ++ budou moci po přečtení tohoto tutoriálu použít sdílený ukazatel ve svém kódu.