Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π―Π·Ρ‹ΠΊ программирования C++. ΠŸΡΡ‚ΠΎΠ΅ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 153

Автор Π‘Ρ‚Π΅Π½Π»ΠΈ Π›ΠΈΠΏΠΏΠΌΠ°Π½

12.1.1. Класс shared_ptr

Подобно Π²Π΅ΠΊΡ‚ΠΎΡ€Π°ΠΌ, ΠΈΠ½Ρ‚Π΅Π»Π»Π΅ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ шаблонами (см. Ρ€Π°Π·Π΄Π΅Π» 3.3). ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΏΡ€ΠΈ создании ΠΈΠ½Ρ‚Π΅Π»Π»Π΅ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ указатСля слСдуСт ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ β€” Π² Π΄Π°Π½Π½ΠΎΠΌ случаС Ρ‚ΠΈΠΏ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ способСн ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ. Подобно Π²Π΅ΠΊΡ‚ΠΎΡ€Π°ΠΌ, этот Ρ‚ΠΈΠΏ ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ Π² ΡƒΠ³Π»ΠΎΠ²Ρ‹Ρ… скобках, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Π·Π° ΠΈΠΌΠ΅Π½Π΅ΠΌ Ρ‚ΠΈΠΏΠ° опрСдСляСмого ΠΈΠ½Ρ‚Π΅Π»Π»Π΅ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ указатСля:

shared_ptr<string> p1;    // shared_ptr ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π° строку

shared_ptr<list<int>> p2; // shared_ptr ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π°

                          // список Ρ†Π΅Π»Ρ‹Ρ… чисСл

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΠ½Ρ‚Π΅Π»Π»Π΅ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Ρ…Ρ€Π°Π½ΠΈΡ‚ Π½ΡƒΠ»Π΅Π²ΠΎΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ (см. Ρ€Π°Π·Π΄Π΅Π» 2.3.2). Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ способы ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈΠ½Ρ‚Π΅Π»Π»Π΅ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ указатСля Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 12.1.3.

Π˜Π½Ρ‚Π΅Π»Π»Π΅ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ‚Π΅ΠΌΠΈ ΠΆΠ΅ способами, Ρ‡Ρ‚ΠΎ ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ. ΠžΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ ΠΈΠ½Ρ‚Π΅Π»Π»Π΅ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ указатСля Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ½ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚. Когда ΠΈΠ½Ρ‚Π΅Π»Π»Π΅ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² условии, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°ΡΠ²ΠΈΠ΄Π΅Ρ‚Π΅Π»ΡŒΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ, Π½Π΅ являСтся Π»ΠΈ ΠΎΠ½ Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌ:

// Ссли ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ p1 Π½Π΅ Π½ΡƒΠ»Π΅Π²ΠΎΠΉ ΠΈ Π½Π΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° ΠΏΡƒΡΡ‚ΡƒΡŽ строку

if (p1 && p1->empty())

 *p1 = "hi"; // ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ p1, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ Π΅ΠΌΡƒ

             // Π½ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ строки

Бписок ΠΎΠ±Ρ‰ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ shared_ptr ΠΈ unique_ptr ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π² Ρ‚Π°Π±Π». 12.1. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ, спСцифичСскиС для указатСля shared_ptr, пСрСчислСны Π² Ρ‚Π°Π±Π». 12.2.


Π’Π°Π±Π»ΠΈΡ†Π° 12.1. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΎΠ±Ρ‰ΠΈΠ΅ для ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ shared_ptr ΠΈ unique_ptr

shared_ptr<T> sp unique_ptr<T> up НулСвой ΠΈΠ½Ρ‚Π΅Π»Π»Π΅ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ, способный ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Ρ‚ΠΈΠΏΠ° Π’ p ΠŸΡ€ΠΈ использовании указатСля p Π² условии возвращаСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ true, Ссли ΠΎΠ½ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ *p ΠžΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ указатСля p Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ½ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ p->mem Π‘ΠΈΠ½ΠΎΠ½ΠΈΠΌ для (*p).mem p.get() Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ, Ρ…Ρ€Π°Π½ΠΈΠΌΡ‹ΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ p. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π΅Π³ΠΎ остороТно, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ½ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ сущСствованиС послС удалСния Π΅Π³ΠΎ ΠΈΠ½Ρ‚Π΅Π»Π»Π΅ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ swap(p, q) p.swap(q) ΠžΠ±ΠΌΠ΅Π½ΠΈΠ²Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π² p ΠΈ q

Π’Π°Π±Π»ΠΈΡ†Π° 12.2. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ, спСцифичСскиС для указатСля shared_ptr

make_shared<T>(args) Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ shared_ptr Π½Π° динамичСски созданный ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° Π’. АргумСнты args ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ создаваСмого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° shared_ptr<T> p(q) p β€” копия shared_ptr q; ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ счСтчика q. Π’ΠΈΠΏ содСрТащСгося Π² q указатСля Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΠΌ ΠΊ Ρ‚ΠΈΠΏΡƒ Π’* (см. Ρ€Π°Π·Π΄Π΅Π» 4.11.2) p = q p ΠΈ q β€” ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ shared_ptr, содСрТащиС ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ, Π΄ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‰ΠΈΠ΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π΄Ρ€ΡƒΠ³ ΠΊ Π΄Ρ€ΡƒΠ³Ρƒ. ΠŸΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ Π΄Π΅ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ счСтчика ссылок p ΠΈ ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ счСтчика q; Ссли счСтчик указатСля p достиг 0, ΠΏΠ°ΠΌΡΡ‚ΡŒ Π΅Π³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° освобоТдаСтся p.unique() Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ true, Ссли p.use_count() Ρ€Π°Π²Π½ΠΎ Π΅Π΄ΠΈΠ½ΠΈΡ†Π΅, ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ false Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС p.use_count() Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ количСство ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², совмСстно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΡ… ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ p; ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π° ΠΏΡ€Π΅ΠΆΠ΄Π΅ всСго для ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ Ѐункция make_shared()

НаиболСС бСзопасный способ рСзСрвирования ΠΈ использования динамичСской памяти ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π΅Ρ‚ Π²Ρ‹Π·ΠΎΠ² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ make_shared(). Она Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π² динамичСской памяти, возвращая ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Ρ‚ΠΈΠΏΠ° shared_ptr Π½Π° этот ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. Как ΠΈ Ρ‚ΠΈΠΏΡ‹ ΠΈΠ½Ρ‚Π΅Π»Π»Π΅ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ, функция make_shared() ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ΅ memory.

ΠŸΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ make_shared() слСдуСт ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏ создаваСмого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Π­Ρ‚ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ использованию шаблона класса β€” Π·Π° ΠΈΠΌΠ΅Π½Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ слСдуСт ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° Π² ΡƒΠ³Π»ΠΎΠ²Ρ‹Ρ… скобках:

// ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ shared_ptr Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° int со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ 42

shared_ptr<int> p3 = make_shared<int>(42);

// Ρ€4 ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° строку со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ '9999999999'

shared_ptr<string> Ρ€4 = make_shared<string>(10, '9');

// Ρ€5 ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° int со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠΎ

// ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (p. 3.3.1) 0

shared_ptr<int> Ρ€5 = make_shared<int>();

Подобно Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Ρƒ emplace() ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° (см. Ρ€Π°Π·Π΄Π΅Π» 9.3.1), функция make_shared() ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ свои Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ для создания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°. НапримСр, ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ make_shared<string>() слСдуСт ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ (Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹), ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΈΠ· конструкторов Ρ‚ΠΈΠΏΠ° string. Π’Ρ‹Π·ΠΎΠ²Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ make_shared<int>() ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ любоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Ρ‚ΠΈΠΏΠ° int, ΠΈ Ρ‚.Π΄. Если Π½Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹, Ρ‚ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ инициализируСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (см. Ρ€Π°Π·Π΄Π΅Π» 3.3.1).

Для облСгчСния опрСдСлСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, содСрТащСго Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ make_shared(), ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово auto (см. Ρ€Π°Π·Π΄Π΅Π» 2.5.2):

// p6 ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° динамичСски созданный пустой Π²Π΅ΠΊΡ‚ΠΎΡ€ vector<string>

auto p6 = make_shared<vector<string>>();

ΠšΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ присвоСниС ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ shared_ptr

ΠŸΡ€ΠΈ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ ΠΈ присвоСнии ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ shared_ptr ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· Π½ΠΈΡ… отслСТиваСт количСство Π΄Ρ€ΡƒΠ³ΠΈΡ… ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ shared_ptr Π½Π° Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚:

auto p = make_shared<int>(42); // ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ p

                               // ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π°

auto q(p); // p ΠΈ q ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ Π½Π° Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚

// ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ p ΠΈ q, ΠΈΠΌΠ΅Π΅Ρ‚ Π΄Π²ΡƒΡ… Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π΅Π²

Π‘ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ shared_ptr связан счСтчик, ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ счСтчиком ссылок (reference count). ΠŸΡ€ΠΈ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ указатСля shared_ptr Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ счСтчика увСличиваСтся. НапримСр, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ связанного с ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ shared_ptr счСтчика увСличиваСтся, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ указатСля shared_ptr, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΈ использовании Π΅Π³ΠΎ Π² качСствС ΠΏΡ€Π°Π²ΠΎΠ³ΠΎ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Π° присвоСния, ΠΈΠ»ΠΈ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ Π΅Π³ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (см. Ρ€Π°Π·Π΄Π΅Π» 6.2.1), ΠΈΠ»ΠΈ ΠΏΡ€ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ (см. Ρ€Π°Π·Π΄Π΅Π» 6.3.2). Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ счСтчика увСличиваСтся ΠΏΡ€ΠΈ присвоСнии Π½ΠΎΠ²ΠΎΠ³ΠΎ значСния ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŽ shared_ptr, Π° ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ удаляСтся ΠΈΠ»ΠΈ ΠΊΠΎΠ³Π΄Π° Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ shared_ptr Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΈΠ· области видимости (см. Ρ€Π°Π·Π΄Π΅Π» 6.1.1), Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ счСтчика ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ΡΡ.

Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ счСтчик указатСля shared_ptr достигаСт нуля, ΠΎΠ½ автоматичСски освобоТдаСт ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚:

auto r = make_shared<int>(42); // ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ int, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ r,

                               // ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π°

r = q; // присвоСниС r ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΡ‚ этот ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ адрСс

// ΠΏΡ€ΠΈΡ€Π°Ρ‰Π΅Π½ΠΈΠ΅ счСтчика Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π΅Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ q

// ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΠ΅ счСтчика Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π΅Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ r

// ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π» r, Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ Π±ΠΎΠ»Π΅Π΅ Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π΅Π²;

// ΠΎΠ½ освобоТдаСтся автоматичСски

Π—Π΄Π΅ΡΡŒ рСзСрвируСтся пСрСмСнная Ρ‚ΠΈΠΏΠ° int, Π° Π΅Π΅ адрСс сохраняСтся Π² ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ r. Π—Π°Ρ‚Π΅ΠΌ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŽ r присваиваСтся Π½ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС r β€” СдинствСнный ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Ρ‚ΠΈΠΏΠ° shared_ptr, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ Π½Π° этот ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ присвоСния r = q пСрСмСнная int автоматичСски освобоТдаСтся.

Π‘ΡƒΠ΄Π΅Ρ‚ Π»ΠΈ использован счСтчик ΠΈΠ»ΠΈ другая структура Π΄Π°Π½Π½Ρ‹Ρ… для отслСТивания количСства ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π° совмСстно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, зависит ΠΎΡ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ компилятора. Π“Π»Π°Π²Π½ΠΎΠ΅ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ класс отслСТиваСт количСство ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ shared_ptr Π½Π° Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈ автоматичСски освобоТдаСт Π΅Π³ΠΎ Π² подходящий ΠΌΠΎΠΌΠ΅Π½Ρ‚.

Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ shared_ptr автоматичСски удаляСт свои ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹β€¦

Когда послСдний ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ shared_ptr Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ удаляСтся, Π΅Π³ΠΎ класс автоматичСски удаляСт ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ½ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚. Для этого ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ другая ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Π°Ρ функция-Ρ‡Π»Π΅Π½ β€” дСструктор (destructor), аналогичная конструкторам, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΅ΡΡ‚ΡŒ Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ класса. Подобно Ρ‚ΠΎΠΌΡƒ, ΠΊΠ°ΠΊ конструктор ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ, дСструктор ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ происходящСС ΠΏΡ€ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² этого Ρ‚ΠΈΠΏΠ°.