C ++ shared_ptr

C Shared_ptr



The shared_ptr е един вид интелигентни указатели на C ++, който съдържа споделената собственост на обекта, създаден от показалеца. Той споделя собствеността на обекта, когато съхранява показалеца в друг обект, а споделеният брояч на референтните брои броя на собствениците. The shared_ptr увеличава референтния брояч с едно след копиране на обекта и намалява брояча на референции с един след унищожаване на обекта. Паметта, притежавана от обекта, се преразпределя, ако обектът е собственост на последния shared_ptr е унищожен, или нулиране() функция се извиква, за да присвои друг показалец за обекта. Когато shared_ptr не притежава никакъв обект, тогава се нарича празен споделен указател. Различни приложения на shared_ptr са показани в този урок.

Пример 1: Декларирайте споделен указател по различни начини

Три различни начина за деклариране на споделен указател са показани в следния пример. Клас с конструктор и публичен метод са декларирани в кода. Конструкторът ще отпечата съобщение, когато се създаде нов споделен обект с конструктора. The Дисплей () метод ще отпечатва съобщения въз основа на извикващия обект на споделен указател. Тук първият обект на споделен указател е създаден без извикване на конструктора. Вторият обект на споделен указател е създаден чрез извикване на конструктора. Третият споделен указател е създаден чрез присвояване на първия споделен указател. The Дисплей () метод е извикан три пъти с помощта на три обекта на споделен указател.







// Включете необходимите библиотеки

#включва

#включва

с помощта на namespacestd;

// Определете класа
classMyClass{
обществен:
// Декларираме конструктора
Моят клас() {
цена<<„Конструкторът се нарича.н';
}
// Декларира метод за отпечатване на текст
voidDisplay(низ str)
{
цена<<'Методът Display () се извиква от'<<стр<<'показалец.н';
}
};

intmain()
{
// Инициализиране на shared_ptr без извикване на конструктор
shared_ptr p1=make_shared();
p1->Дисплей('първи');
// Инициализиране на shared_ptr чрез извикване на конструктор
shared_ptr p2=shared_ptr(newMyClass);
p2->Дисплей('втори');

// Инициализиране на shared_ptr чрез присвояване
shared_ptr p3=p1;
p3->Дисплей(„трети“);
връщане0;
}

Изход:



Следният изход ще се появи след изпълнение на горния код. Конструкторът е извикал само по време на създаването на втори обект. И така, съобщението на конструктора е отпечатано само веднъж:







Пример 2: Отпечатайте съхраненото местоположение на споделен показалец

Споделеният показалец на функцията get () се използва за връщане на съхраненото, споделено местоположение на показалеца. Следващият пример ще отпечата местоположението на съхранените, споделени указатели, създадени от класа и функцията. Тук е определен клас с конструктор, който да се използва за създаване на споделен указател. Декларирана е функция за създаване на споделен указател и отпечатване на местоположението на споделения показалец с помощта на функцията get (). В този код първият споделен указател е създаден с помощта на класа, вторият споделен показалец е създаден с помощта на функцията, а третият споделен указател е създаден чрез присвояване на първия указател.

// Включете необходимите библиотеки

#включва

#включва

с помощта на namespacestd;

// Определете класа
classMyClass
{
обществен:
// Декларираме конструктора
Моят клас() {
цена<<„Конструкторът се нарича.н';
}
};
// Определете функция за инициализиране на показалеца
voidInit_shared_ptr()
{
shared_ptr p2(newMyClass);
цена<<p2.вземете() <<'н';
}

intmain()
{
// Инициализиране на shared_ptr чрез извикване на конструктор
shared_ptr p1=shared_ptr(newMyClass);
цена<<p1.вземете() <<'н';

// Инициализиране на shared_ptr чрез извикване на функция
Init_shared_ptr();

// Инициализиране на shared_ptr чрез присвояване
shared_ptr p3=p1;
цена<<p3.вземете() <<'н';
връщане0;
}

Изход:



Следният подобен изход ще се появи след изпълнение на горния код. В изхода връщаната стойност на функцията get () за първия и третия споделени указатели е еднаква. Вторият споделен показалец обаче е различен:

Пример 3: Пребройте обектите на споделен указател

Следващият пример изобразява начин за преброяване на броя обекти, посочени от споделен показалец след създаването и унищожаването на показалеца. В кода е деклариран клас с конструктор. Първият споделен показалец е създаден с помощта на класа, а вторият споделен показалец е създаден с помощта на първия споделен указател. Броят на обектите, посочени от двата споделени указателя преди и след извикване на функцията reset (), е отпечатан по -късно.

// Включете необходимите библиотеки

#включва

#включва

с помощта на namespacestd;
// Определете класа
classMyClass{
обществен:
// Декларираме конструктора
Моят клас() {
цена<<„Конструкторът се нарича.н';
}
};
intmain()
{
// Инициализираме първия shared_ptr чрез извикване на конструктор
shared_ptr p1(newMyClass);

// Показва броя на споделените_ptr обекти от първия показалец
цена<<'p1 сочи към'<<p1.use_count() <<'обект (и).н';
// Инициализираме втория shared_ptr, използвайки първия shared_ptr
shared_ptr p2(p1);
// Показване на броя на shared_ptr обектите от първия и втория указател
цена<<'p2 сочещ към'<<p2.use_count() <<'обект (и).н';
цена<<'p1 сочи към'<<p1.use_count() <<'обект (и).н';
// Премахване на собствеността на първия показалец от обекта shared_ptr
p1.нулиране();
// Показва броя на споделените_ptr обекти от втория показалец
цена<<'p2 сочещ към'<<p2.use_count() <<'обект (и).н';
връщане0;
}

Изход:

Следният изход ще се появи след изпълнение на горния код. Първият показалец, p1 , сочи към един обект след създаването. След създаването на втория показалец, p2 , използвайки първия показалец, p1 , и двете показалки сочат към два обекта за споделяне на показалеца. След извикване на функцията reset () за показалеца, p1 , един обект е унищожен, а показалецът, p2 , сега сочи само към един обект.

Заключение:

Целите на използването на споделен указател в C ++ са обяснени в този урок с помощта на прости примери. Създаване на споделени указатели по различни начини, получаване на съхранено местоположение на споделен показалец и преброяване на броя обекти, посочени от споделените указатели. Надявам се, че C ++ кодерите ще могат да използват споделения указател в кода си, след като прочетат този урок.