C ++ shared_ptr

C Shared_ptr



De shared_ptr är en typ av smarta pekare för C ++ som innehåller det delade ägandet av objektet som skapats av pekaren. Den delar äganderätten till objektet när pekaren lagras i ett annat objekt, och den delade referensräknaren räknar antalet ägare. De shared_ptr ökar referensräknaren med en efter kopiering av objektet och minskar referensräknaren med en efter att ha förstört objektet. Minnet som ägs av objektet omfördelas om objektet som ägs av det sista shared_ptr förstörs, eller återställa() funktion kallas för att tilldela en annan pekare för objektet. När shared_ptr inte äger något objekt, kallas det en tom delad pekare. Olika användningsområden för shared_ptr har visats i denna handledning.

Exempel 1: Deklarera delad pekare på olika sätt

Tre olika sätt att deklarera en delad pekare visas i följande exempel. En klass med en konstruktör och en offentlig metod har deklarerats i koden. Konstruktören skriver ut ett meddelande när ett nytt delat objekt skapas med konstruktören. De Visa() metoden kommer att skriva ut meddelanden baserat på det anropade delade pekarobjektet. Här har det första delade pekarobjektet skapats utan att anropa konstruktören. Det andra delade pekarobjektet har skapats genom att anropa konstruktören. Den tredje delade pekaren har skapats genom att tilldela den första delade pekaren. De Visa() metoden har kallats tre gånger med hjälp av tre delade pekarobjekt.







// Inkludera nödvändiga bibliotek

#omfatta

#omfatta

med namnspacestd;

// Definiera klassen
classMyClass{
offentlig:
// Deklarera konstruktören
Min klass() {
kosta<<'Konstruktören heter. n';
}
// Deklarera en metod för att skriva ut text
voidDisplay(sträng str)
{
kosta<<'Display () -metoden anropas från'<<sid<<'pekare. n';
}
};

i huvudsak()
{
// Initiera shared_ptr utan att ringa konstruktören
shared_ptr p1=make_shared();
p1->Visa('först');
// Initiera shared_ptr genom att ringa konstruktör
shared_ptr p2=shared_ptr(newMyClass);
p2->Visa('andra');

// Initiera shared_ptr med tilldelning
shared_ptr p3=p1;
p3->Visa('tredje');
retur0;
}

Produktion:



Följande utdata visas efter att koden ovan har körts. Konstruktören har endast ringt vid tidpunkten för det andra objektets skapande. Så, konstruktörens meddelande har skrivits ut bara en gång:







Exempel 2: Skriv ut den lagrade delade pekarplatsen

Funktionen get () delad pekare används för att returnera den lagrade, delade pekarplatsen. I följande exempel skrivs ut platsen för de lagrade, delade pekarna som skapas av klassen och funktionen. Här har en klass med en konstruktör definierats för att användas för att skapa en delad pekare. En funktion har deklarerats för att skapa en delad pekare och skriva ut platsen för den delade pekaren med funktionen get (). I den här koden har den första delade pekaren skapats med klassen, den andra delade pekaren har skapats med funktionen och den tredje delade pekaren har skapats genom att tilldela den första pekaren.

// Inkludera nödvändiga bibliotek

#omfatta

#omfatta

med namnspacestd;

// Definiera klassen
classMyClass
{
offentlig:
// Deklarera konstruktören
Min klass() {
kosta<<'Konstruktören heter. n';
}
};
// Definiera funktion för att initiera pekaren
voidInit_shared_ptr()
{
shared_ptr p2(newMyClass);
kosta<<p2.skaffa sig() <<' n';
}

i huvudsak()
{
// Initiera shared_ptr genom att ringa konstruktör
shared_ptr p1=shared_ptr(newMyClass);
kosta<<p1.skaffa sig() <<' n';

// Initiera shared_ptr genom att ringa funktion
Init_shared_ptr();

// Initiera shared_ptr med tilldelning
shared_ptr p3=p1;
kosta<<p3.skaffa sig() <<' n';
retur0;
}

Produktion:



Följande liknande utdata visas efter att koden ovan har körts. I utdata är det returnerade värdet för funktionen get () för de första och tredje delade pekarna desamma. Den andra delade pekaren är dock annorlunda:

Exempel 3: Räkna delade pekarobjekt

Följande exempel visar ett sätt att räkna antalet objekt som en delad pekare pekar på efter att ha skapat och förstör pekaren. En klass med en konstruktör har deklarerats i koden. Den första delade pekaren har skapats med klassen och den andra delade pekaren har skapats med den första delade pekaren. Antalet objekt som både delade pekare pekade på före och efter anropet reset () har skrivits ut senare.

// Inkludera nödvändiga bibliotek

#omfatta

#omfatta

med namnspacestd;
// Definiera klassen
classMyClass{
offentlig:
// Deklarera konstruktören
Min klass() {
kosta<<'Konstruktören heter. n';
}
};
i huvudsak()
{
// Initiera den första shared_ptr genom att ringa konstruktorn
shared_ptr p1(newMyClass);

// Visa antalet shared_ptr -objekt med den första pekaren
kosta<<'p1 pekar på'<<p1.use_count() <<' objekt). n';
// Initiera den andra shared_ptr med den första shared_ptr
shared_ptr p2(p1);
// Visa antalet shared_ptr -objekt med den första och andra pekaren
kosta<<'p2 pekar på'<<p2.use_count() <<' objekt). n';
kosta<<'p1 pekar på'<<p1.use_count() <<' objekt). n';
// Ta bort äganderätten till den första pekaren från objektet shared_ptr
p1.återställa();
// Visa antalet shared_ptr -objekt med den andra pekaren
kosta<<'p2 pekar på'<<p2.use_count() <<' objekt). n';
retur0;
}

Produktion:

Följande utdata visas efter att koden ovan har körts. Den första pekaren, p1 , pekar på ett objekt efter skapandet. Efter att ha skapat den andra pekaren, p2 med den första pekaren, p1 , båda pekarna pekar på två objekt för att dela pekaren. Efter att ha kallat reset () -funktionen för pekaren, p1 , ett objekt har förstörts och pekaren, p2 , pekar nu bara på ett objekt.

Slutsats:

Syftet med att använda en delad pekare i C ++ har förklarats i denna handledning med hjälp av enkla exempel. Skapa delade pekare på olika sätt, lagra delad pekarplats och räkna antalet objekt som pekas av de delade pekarna. Jag hoppas att C ++ - kodarna kommer att kunna använda den delade pekaren i sin kod efter att ha läst den här självstudien.