C ++ delt_ptr

C Shared_ptr



Det delt_ptr er en type smarte pegepinde til C ++, der indeholder det delte ejerskab af objektet, der er oprettet af markøren. Den deler ejendomsretten til objektet, når markøren gemmes i et andet objekt, og den delte referencetæller tæller antallet af ejere. Det delt_ptr øger referencetælleren med en efter kopiering af objektet og reducerer referencetælleren med en efter at have ødelagt objektet. Hukommelsen, der ejes af objektet, omdisponeres, hvis objektet ejes af det sidste delt_ptr ødelægges, eller Nulstil() funktion kaldes til at tildele en anden markør til objektet. Når delt_ptr ikke ejer noget objekt, så kaldes det en tom delt markør. Forskellige anvendelser af delt_ptr er blevet vist i denne vejledning.

Eksempel 1: Deklarer delt pointer på forskellige måder

Tre forskellige måder at erklære en delt markør på er vist i det følgende eksempel. En klasse med en konstruktør og en offentlig metode er blevet erklæret i koden. Konstruktøren udskriver en meddelelse, når der oprettes et nyt delt objekt med konstruktøren. Det Skærm() metode vil udskrive meddelelser baseret på det kaldende delte markørobjekt. Her er det første delte markørobjekt blevet oprettet uden at kalde konstruktøren. Det andet delte markørobjekt er blevet oprettet ved at kalde konstruktøren. Den tredje delte markør er oprettet ved at tildele den første delte markør. Det Skærm() metode er blevet kaldt tre gange ved hjælp af tre delte markørobjekter.







// Inkluder nødvendige biblioteker

#omfatte

#omfatte

ved hjælp af navnespacestd;

// Definer klassen
classMyClass{
offentlig:
// Deklarér konstruktøren
Min klasse() {
koste<<'Konstruktøren kaldes. n';
}
// Angiv en metode til udskrivning af tekst
voidDisplay(streng str)
{
koste<<'Display () -metoden kaldes fra'<<s<<'markør. n';
}
};

intmain()
{
// Initialiser shared_ptr uden at ringe til konstruktøren
delt_ptr p1=make_shared();
p1->Skærm('først');
// Initialiser shared_ptr ved at ringe til constructor
delt_ptr p2=delt_ptr(newMyClass);
p2->Skærm('sekund');

// Initialiser shared_ptr ved opgave
delt_ptr p3=p1;
p3->Skærm('tredje');
return0;
}

Produktion:



Følgende output vises efter udførelse af ovenstående kode. Konstruktøren har kun kaldt på tidspunktet for anden genstands oprettelse. Så konstruktørens besked er kun blevet udskrevet én gang:







Eksempel 2: Udskriv placeringen af ​​den gemte delte markør

Get () -funktionen delt markør bruges til at returnere den gemte, delte markørplacering. Følgende eksempel vil udskrive placeringen af ​​de gemte, delte pointer, der er oprettet af klassen og funktionen. Her er en klasse med en konstruktør blevet defineret til at blive brugt til at oprette en delt markør. En funktion er blevet erklæret for at oprette en delt markør og udskrive den delte markørplacering ved hjælp af funktionen get (). I denne kode er den første delte markør blevet oprettet ved hjælp af klassen, den anden delte markør er blevet oprettet ved hjælp af funktionen, og den tredje delte markør er blevet oprettet ved at tildele den første markør.

// Inkluder nødvendige biblioteker

#omfatte

#omfatte

ved hjælp af navnespacestd;

// Definer klassen
classMyClass
{
offentlig:
// Deklarér konstruktøren
Min klasse() {
koste<<'Konstruktøren kaldes. n';
}
};
// Definer funktion for at initialisere markøren
voidInit_shared_ptr()
{
delt_ptr p2(newMyClass);
koste<<p2.() <<' n';
}

intmain()
{
// Initialiser shared_ptr ved at ringe til constructor
delt_ptr p1=delt_ptr(newMyClass);
koste<<p1.() <<' n';

// Initialiser shared_ptr ved at kalde funktion
Init_shared_ptr();

// Initialiser shared_ptr ved opgave
delt_ptr p3=p1;
koste<<p3.() <<' n';
return0;
}

Produktion:



Følgende lignende output vises efter udførelse af ovenstående kode. I output er værdien returneret af get () -funktionen for de første og tredje delte pointer det samme. Den anden delte markør er imidlertid anderledes:

Eksempel 3: Tæl de delte markørobjekter

Følgende eksempel viser en måde at tælle antallet af objekter, der peges af en delt markør, efter at du har oprettet og ødelagt markøren. En klasse med en konstruktør er blevet erklæret i koden. Den første delte markør er blevet oprettet ved hjælp af klassen, og den anden delte markør er blevet oprettet ved hjælp af den første delte markør. Antallet af objekter, som begge delte pointer pegede på før og efter kaldet til reset () -funktionen, er blevet udskrevet senere.

// Inkluder nødvendige biblioteker

#omfatte

#omfatte

ved hjælp af navnespacestd;
// Definer klassen
classMyClass{
offentlig:
// Deklarér konstruktøren
Min klasse() {
koste<<'Konstruktøren kaldes. n';
}
};
intmain()
{
// Initialiser den første shared_ptr ved at ringe til constructor
delt_ptr p1(newMyClass);

// Vis antallet af shared_ptr -objekter med den første markør
koste<<'p1 peger på'<<p1.use_count() <<'objekt (er). n';
// Initialiser den anden shared_ptr ved hjælp af den første shared_ptr
delt_ptr p2(p1);
// Vis antallet af shared_ptr -objekter med den første og anden pointer
koste<<'p2 peger på'<<p2.use_count() <<'objekt (er). n';
koste<<'p1 peger på'<<p1.use_count() <<'objekt (er). n';
// Fjern ejerskabet til den første markør fra objektet shared_ptr
p1.Nulstil();
// Vis antallet af shared_ptr -objekter med den anden markør
koste<<'p2 peger på'<<p2.use_count() <<'objekt (er). n';
return0;
}

Produktion:

Følgende output vises efter udførelse af ovenstående kode. Den første markør, p1 , peger på et objekt efter oprettelsen. Efter at have oprettet den anden markør, p2 ved hjælp af den første markør, p1 , begge pointer peger på to objekter til deling af markøren. Efter at have kaldt reset () -funktionen til markøren, p1 , et objekt er blevet ødelagt, og markøren, p2 , peger nu kun på et objekt.

Konklusion:

Formålet med at bruge en delt markør i C ++ er blevet forklaret i denne vejledning ved hjælp af enkle eksempler. Oprettelse af delte pegepinde på forskellige måder, lagring af delt markørplacering og tælling af antallet af objekter, der peges af de delte pegepinde. Jeg håber, at C ++ - koderne vil kunne bruge den delte markør i deres kode efter at have læst denne vejledning.