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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π­Ρ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ΅ использованиС STLΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 18

Автор Π‘ΠΊΠΎΡ‚Ρ‚ ΠœΠ΅ΠΉΠ΅Ρ€Ρ

vector<int> v;

getMutexFor(v);

vector<int>::iterator first5(find(v.begin(),v.end(),5));

if (first5 != v.end()) {// Π’Π΅ΠΏΠ΅Ρ€ΡŒ эта строка бСзопасна

*first5 = 0:// И эта строка Ρ‚ΠΎΠΆΠ΅

}

releaseMutexFor(v);

Π’ Π΄Ρ€ΡƒΠ³ΠΎΠΌ, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ, Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΈ создаСтся класс Lock, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π·Π°Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ Π² конструкторС ΠΈ освобоТдаСт Π΅Π³ΠΎ Π² дСструкторС, Ρ‡Ρ‚ΠΎ сводит ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌΡƒ Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ Π²Ρ‹Π·ΠΎΠ²Π° getMutexFor Π±Π΅Π· ΠΏΠ°Ρ€Π½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° releaseMutexFor. Основа Ρ‚Π°ΠΊΠΎΠ³ΠΎ класса (Ρ‚ΠΎΡ‡Π½Π΅Π΅, шаблона) выглядит ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊ:

template<typename Container> // Π‘Π°Π·ΠΎΠ²Ρ‹ΠΉ шаблон для классов,

class Lock{// Π·Π°Ρ…Π²Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‰ΠΈΡ… ΠΈ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°ΡŽΡ‰ΠΈΡ… ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΡ‹

public:// для ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ²: ΠΌΠ½ΠΎΠ³ΠΈΠ΅ тСхничСскиС

// Π΄Π΅Ρ‚Π°Π»ΠΈ ΠΎΠΏΡƒΡ‰Π΅Π½Ρ‹

Lock(const Containers container)

:c(container)

{

getMutexFor(с);// Π—Π°Ρ…Π²Π°Ρ‚ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ° Π² конструкторС

}

~Lock () {

releaseMutexFor(c): // ОсвобоТдСниС ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ° Π² дСструкторС

}

private:

const Container& с;

ΠšΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΡ управлСния ΠΆΠΈΠ·Π½Π΅Π½Π½Ρ‹ΠΌ Ρ†ΠΈΠΊΠ»ΠΎΠΌ рСсурсов (Π² Π΄Π°Π½Π½ΠΎΠΌ случаС β€” ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠΎΠ²) ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ спСциализированных классов Π²Ρ€ΠΎΠ΄Π΅ Lock рассматриваСтся Π² любом ΡΠ΅Ρ€ΡŒΠ΅Π·Π½ΠΎΠΌ ΡƒΡ‡Π΅Π±Π½ΠΈΠΊΠ΅ Π‘++. ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ Π½Π°Ρ‡Π°Ρ‚ΡŒ с ΠΊΠ½ΠΈΠ³ΠΈ Бтрауструпа (Stroustrup) Β«The Π‘++ Programming LanguageΒ» [7], ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΈΠΌΠ΅Π½Π½ΠΎ Бтрауструп популяризировал эту ΠΈΠ΄ΠΈΠΎΠΌΡƒ, ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π² совСтС 9 Β«More Effective Π‘++Β». Каким Π±Ρ‹ источником Π²Ρ‹ Π½ΠΈ воспользовались, ΠΏΠΎΠΌΠ½ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π²Ρ‹ΡˆΠ΅ класс Lock ΡƒΡ€Π΅Π·Π°Π½ Π΄ΠΎ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎΠ³ΠΎ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌΠ°. ΠŸΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½Π°Ρ вСрсия содСрТала Π±Ρ‹ многочислСнныС дополнСния, Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠ΅ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ ΠΊ STL. Π’ΠΏΡ€ΠΎΡ‡Π΅ΠΌ, нСсмотря Π½Π° ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΠΈΠ·ΠΌ, привСдСнная вСрсия Lock Π²ΠΏΠΎΠ»Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² рассматриваСмом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅:

vector<int> v;

...

{// Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ°

Lock<vector<int> > lock(v); // ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°

vector<int>::iterator first5(find(v.begin().v.end().5));

if (first5 != v.end()) {

*first5 - 0:

}

}// Π—Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ Π±Π»ΠΎΠΊΠ° с автоматичСским

// освобоТдСниСм ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° освобоТдаСтся Π² дСструкторС Lock, Π²Π°ΠΆΠ½ΠΎ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ΅Π½ΠΈΠ΅ Lock сразу ΠΆΠ΅ послС освобоТдСния ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°. Для этого ΠΌΡ‹ создаСм Π½ΠΎΠ²Ρ‹ΠΉ Π±Π»ΠΎΠΊ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ опрСдСляСтся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Lock, ΠΈ Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ Π΅Π³ΠΎ, ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π°Π΄ΠΎΠ±Π½ΠΎΡΡ‚ΡŒ Π² ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ΅ ΠΎΡ‚ΠΏΠ°Π΄Π°Π΅Ρ‚. На ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ взгляд каТСтся, Ρ‡Ρ‚ΠΎ Π²Ρ‹Π·ΠΎΠ² releaseMutexFor попросту Π·Π°ΠΌΠ΅Π½Π΅Π½ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒΡŽ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ Π±Π»ΠΎΠΊ, Π½ΠΎ это Π½Π΅ совсСм Ρ‚Π°ΠΊ. Если ΠΌΡ‹ Π·Π°Π±ΡƒΠ΄Π΅ΠΌ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ Π±Π»ΠΎΠΊ для Lock, ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ всС Ρ€Π°Π²Π½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ освобоТдСн, Π½ΠΎ это ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΡ‚ΠΈ ΠΏΠΎΠ·Π΄Π½Π΅Π΅ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° β€” ΠΏΡ€ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π΅ ΠΈΠ· внСшнСго Π±Π»ΠΎΠΊΠ°. Если Π·Π°Π±Ρ‹Ρ‚ΡŒ ΠΎ Π²Ρ‹Π·ΠΎΠ²Π΅ releaseMutexFor, ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅ освобоТдаСтся.

Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, основанноС Π½Π° классС Lock, Π»ΡƒΡ‡ΡˆΠ΅ Π·Π°Ρ‰ΠΈΡ‰Π΅Π½ΠΎ ΠΎΡ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ. Π‘++ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΏΡ€ΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, поэтому Lock освободит ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ, Π΄Π°ΠΆΠ΅ Ссли ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈ использовании ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Lock. ΠŸΡ€ΠΈ использовании ΠΏΠ°Ρ€Π½Ρ‹Ρ… Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² getMutexFor/ releaseMutexFor ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ освобоТдСн, Ссли ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ происходит послС Π²Ρ‹Π·ΠΎΠ²Π° getMutexFor, Π½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ releaseMutexFor.

Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΈ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ рСсурсами Π²Π°ΠΆΠ½Ρ‹, Π½ΠΎ Π΄Π°Π½Π½Ρ‹ΠΉ совСт посвящСн Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ‚Π΅ΠΌΠ΅ β€” ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²ΠΎΠΉ бСзопасности Π² STL. Как Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΎΡΡŒ Π²Ρ‹ΡˆΠ΅, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΡΡ‚ΡŒΡΡ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ рСализация Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ обСспСчиваСт ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠ΅ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° ΠΈ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ запись Π² Ρ€Π°Π·Π½Ρ‹Π΅ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹. НС Π½Π°Π΄Π΅ΠΉΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΈΠ·Π±Π°Π²ΠΈΡ‚ вас ΠΎΡ‚ Ρ€ΡƒΡ‡Π½ΠΎΠΉ синхронизации ΠΈ Π½Π΅ рассчитывайтС Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ многопоточности.

ΠšΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹ vector ΠΈ string

ВсС ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹ STL ΠΏΠΎ-своСму ΠΏΠΎΠ»Π΅Π·Π½Ρ‹, ΠΎΠ΄Π½Π°ΠΊΠΎ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ программистов Π‘++ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с vector ΠΈ string Ρ‡Π°Ρ‰Π΅, Ρ‡Π΅ΠΌ с ΠΈΡ… ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΠΌΠΈ, ΠΈ это Π²ΠΏΠΎΠ»Π½Π΅ понятно. Π’Π΅Π΄ΡŒ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹ vector ΠΈ string Ρ€Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π»ΠΈΡΡŒ ΠΊΠ°ΠΊ Π·Π°ΠΌΠ΅Π½Π° массивов, Π° массивы Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ ΠΈ ΡƒΠ΄ΠΎΠ±Π½Ρ‹, Ρ‡Ρ‚ΠΎ Π²ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‚ΡΡ Π²ΠΎ всСх коммСрчСских языках программирования ΠΎΡ‚ COBOL Π΄ΠΎ Java.

Π’ этой Π³Π»Π°Π²Π΅ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹ vector ΠΈ string Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ΡΡ с Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Ρ‚ΠΎΡ‡Π΅ΠΊ зрСния. Π‘Π½Π°Ρ‡Π°Π»Π° ΠΌΡ‹ разбСрСмся, Ρ‡Π΅ΠΌ ΠΎΠ½ΠΈ прСвосходят классичСскиС массивы STL, Π·Π°Ρ‚Π΅ΠΌ рассмотрим ΠΏΡƒΡ‚ΠΈ ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡ быстродСйствия vector ΠΈ string, познакомимся с Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π°ΠΌΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ string, ΠΈΠ·ΡƒΡ‡ΠΈΠΌ способы ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ string ΠΈ vector функциям API, ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰ΠΈΠΌ Π΄Π°Π½Π½Ρ‹Π΅ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ Π‘. Π”Π°Π»Π΅Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ Π»ΠΈΡˆΠ½ΠΈΡ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ выдСлСния памяти. Π“Π»Π°Π²Π° Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ Π°Π½Π°Π»ΠΈΠ·ΠΎΠΌ ΠΏΠΎΡƒΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Π°Π½ΠΎΠΌΠ°Π»ΠΈΠΈ, vector<bool>.

Π‘ΠΎΠ²Π΅Ρ‚ 13. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ vector ΠΈ string вмСсто динамичСских массивов

ΠŸΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΎ динамичСском Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠΈ памяти ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ new, Π²Ρ‹ Π±Π΅Ρ€Π΅Ρ‚Π΅ Π½Π° сСбя ряд ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΡΡ‚Π².

1.ВыдСлСнная ΠΏΠ°ΠΌΡΡ‚ΡŒ Π² дальнСйшСм Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ освобоТдСна ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ delete. Π’Ρ‹Π·ΠΎΠ² new Π±Π΅Π· ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ delete ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ΡƒΡ‚Π΅Ρ‡ΠΊΠ΅ рСсурсов.

2.ОсвобоТдСниС Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ Ρ„ΠΎΡ€ΠΌΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° delete. ΠžΠ΄ΠΈΠ½ΠΎΡ‡Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ освобоТдаСтся простым Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ delete, Π° для массивов трСбуСтся Ρ„ΠΎΡ€ΠΌΠ° delete []. Ошибка Π² Π²Ρ‹Π±ΠΎΡ€Π΅ Ρ„ΠΎΡ€ΠΌΡ‹ delete ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ нСпрСдсказуСмым послСдствиям. На ΠΎΠ΄Π½ΠΈΡ… ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° «зависаСт» Π²ΠΎ врСмя выполнСния, Π° Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΎΠ½Π° ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с ошибками, приводящими ΠΊ ΡƒΡ‚Π΅Ρ‡ΠΊΠ΅ рСсурсов ΠΈ ΠΏΠΎΡ€Ρ‡Π΅ содСрТимого памяти.

3. ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ delete для освобоТдаСмого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ Ρ€ΠΎΠ²Π½ΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·. ΠŸΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ΅ освобоТдСниС памяти Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ нСпрСдсказуСмым послСдствиям.

Π˜Ρ‚Π°ΠΊ, динамичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти сопряТСно с Π½Π΅ΠΌΠ°Π»ΠΎΠΉ ΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²Π΅Π½Π½ΠΎΡΡ‚ΡŒΡŽ, ΠΈ я Π½Π΅ понимаю, Π·Π°Ρ‡Π΅ΠΌ Π±Ρ€Π°Ρ‚ΡŒ Π½Π° сСбя лишниС ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΡΡ‚Π²Π°. ΠŸΡ€ΠΈ использовании vector ΠΈ string Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ Π² динамичСском Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠΈ памяти Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ€Π΅ΠΆΠ΅.

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ ΠΏΡ€ΠΈΠ±Π΅Π³Π½ΡƒΡ‚ΡŒ ΠΊ динамичСскому Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΡŽ памяти ΠΏΠΎΠ΄ массив (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΡΠΎΠ±ΠΈΡ€Π°Π΅Ρ‚Π΅ΡΡŒ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ строку Π²ΠΈΠ΄Π° Β«new T[...]Β»), ΠΏΠΎΠ΄ΡƒΠΌΠ°ΠΉΡ‚Π΅, нСльзя Π»ΠΈ вмСсто этого Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ vector ΠΈΠ»ΠΈ string. Как ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, string ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ случаС, Ссли Π’ являСтся ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹ΠΌ Ρ‚ΠΈΠΏΠΎΠΌ, Π° vector β€” Π²ΠΎ всСх ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… случаях. Π’ΠΏΡ€ΠΎΡ‡Π΅ΠΌ, ΠΏΠΎΠ·Π΄Π½Π΅Π΅ ΠΌΡ‹ рассмотрим ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹Π±ΠΎΡ€ vector<char> Π²Ρ‹Π³Π»Π°Π΄ΠΈΡ‚ Π²ΠΏΠΎΠ»Π½Π΅ Ρ€Π°Π·ΡƒΠΌΠ½ΠΎ. ΠšΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹ vector ΠΈ string ΠΈΠ·Π±Π°Π²Π»ΡΡŽΡ‚ программиста ΠΎΡ‚ Ρ…Π»ΠΎΠΏΠΎΡ‚, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΎΡΡŒ Π²Ρ‹ΡˆΠ΅, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ΠΈ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ своСй ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ. ЗанимаСмая ΠΈΠΌΠΈ ΠΏΠ°ΠΌΡΡ‚ΡŒ Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅Ρ‚ΡΡ ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ добавлСния Π½ΠΎΠ²Ρ‹Ρ… элСмСнтов, Π° ΠΏΡ€ΠΈ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ΅Π½ΠΈΠΈ vector ΠΈΠ»ΠΈ string дСструктор автоматичСски ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ°Π΅Ρ‚ элСмСнты ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° ΠΈ освобоТдаСт ΠΏΠ°ΠΌΡΡ‚ΡŒ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΎΠ½ΠΈ находятся.

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, vector ΠΈ string входят Π² сСмСйство ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ² STL, поэтому Π² вашСм распоряТСнии оказываСтся вСсь арсСнал Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² STL, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΡ… с этими ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°ΠΌΠΈ. Π’ΠΏΡ€ΠΎΡ‡Π΅ΠΌ, Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ STL ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΈ с массивами, ΠΎΠ΄Π½Π°ΠΊΠΎ Ρƒ массивов ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ ΡƒΠ΄ΠΎΠ±Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ begin, end, size ΠΈ Ρ‚. ΠΏ., Π° Ρ‚Π°ΠΊΠΆΠ΅ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ опрСдСлСния Ρ‚ΠΈΠΏΠΎΠ² (iterator, reverse_iterator, value_type ΠΈ Ρ‚. Π΄.), Π° ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ char* вряд Π»ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒΡΡ со спСциализированными функциями ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° string. Π§Π΅ΠΌ большС Ρ€Π°Π±ΠΎΡ‚Π°Π΅ΡˆΡŒ с STL, Ρ‚Π΅ΠΌ мСньшС энтузиазма Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ встроСнныС массивы.

Если вас бСспокоит ΡΡƒΠ΄ΡŒΠ±Π° унаслСдованного ΠΊΠΎΠ΄Π°, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰Π΅Π³ΠΎ с массивами, Π½Π΅ Π²ΠΎΠ»Π½ΡƒΠΉΡ‚Π΅ΡΡŒ ΠΈ смСло ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ vector ΠΈ string. Π’ совСтС 16 ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊ Π»Π΅Π³ΠΊΠΎ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ содСрТимого vector ΠΈ string функциям Π‘, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠΌ с массивами, поэтому интСграция с унаслСдованным ΠΊΠΎΠ΄ΠΎΠΌ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ обходится Π±Π΅Π· Π·Π°Ρ‚Ρ€ΡƒΠ΄Π½Π΅Π½ΠΈΠΉ.

ЧСстно говоря, ΠΌΠ½Π΅ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ Π² Π³ΠΎΠ»ΠΎΠ²Ρƒ лишь ΠΎΠ΄Π½Π° возмоТная ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° ΠΏΡ€ΠΈ Π·Π°ΠΌΠ΅Π½Π΅ динамичСских массивов ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°ΠΌΠΈ vector/string, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ ΠΎΠ½Π° относится Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊ string. МногиС Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ string основаны Π½Π° подсчСтС ссылок (совСт 15), Ρ‡Ρ‚ΠΎ позволяСт ΠΈΠ·Π±Π°Π²ΠΈΡ‚ΡŒΡΡ ΠΎΡ‚ Π»ΠΈΡˆΠ½ΠΈΡ… Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠΉ памяти ΠΈ копирования символов, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… случаях ускоряСт Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°. ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ string Π½Π° основС подсчСта ссылок Π±Ρ‹Π»Π° сочтСна Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Π°ΠΆΠ½ΠΎΠΉ, Ρ‡Ρ‚ΠΎ ΠšΠΎΠΌΠΈΡ‚Π΅Ρ‚ ΠΏΠΎ стандартизации Π‘++ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΠ» Π΅Π΅ использованиС.

Π’ΠΏΡ€ΠΎΡ‡Π΅ΠΌ, оптимизация Π½Π΅Ρ€Π΅Π΄ΠΊΠΎ оборачиваСтся «пСссимизациСй». ΠŸΡ€ΠΈ использовании string с подсчСтом ссылок Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΉ срСдС врСмя, сэкономлСнноС Π½Π° Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠΈ памяти ΠΈ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ, ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ Π½ΠΈΡ‡Ρ‚ΠΎΠΆΠ½ΠΎ ΠΌΠ°Π»Ρ‹ΠΌ ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ со Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ, Π·Π°Ρ‚Ρ€Π°Ρ‡Π΅Π½Π½Ρ‹ΠΌ Π½Π° ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·Π°Ρ†ΠΈΡŽ доступа (Π·Π° подробностями ΠΎΠ±Ρ€Π°Ρ‰Π°ΠΉΡ‚Π΅ΡΡŒ ΠΊ ΡΡ‚Π°Ρ‚ΡŒΠ΅ Π‘Π°Ρ‚Ρ‚Π΅Ρ€Π° Β«Optimizations That Aren't (In a Multithreaded World)Β» [20]). Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΏΡ€ΠΈ использовании string с подсчСтом ссылок Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΉ срСдС ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ Π·Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°ΠΌΠΈ быстродСйствия, обусловлСнными ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²ΠΎΠΉ бСзопасности.

Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ·Π½Π°Ρ‚ΡŒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π»ΠΈ подсчСт ссылок Π² вашСй Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ string, ΠΏΡ€ΠΎΡ‰Π΅ всСго ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ подсчСт ссылок считаСтся ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ, Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΎΡ‚ΠΌΠ΅Ρ‡Π°ΡŽΡ‚ Π΅Π³ΠΎ срСди ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… особСнностСй Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ. Π’Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ исходным тСкстам Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ string. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ я Π½Π΅ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΡŽ ΠΈΡΠΊΠ°Ρ‚ΡŒ Π½ΡƒΠΆΠ½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ Ρ‚Π°ΠΊΠΈΠΌ способом, Π½ΠΎ ΠΈΠ½ΠΎΠ³Π΄Π° Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ Π²Ρ‹Ρ…ΠΎΠ΄Π° просто Π½Π΅ остаСтся. Если Π²Ρ‹ ΠΏΠΎΠΉΠ΄Π΅Ρ‚Π΅ ΠΏΠΎ этому ΠΏΡƒΡ‚ΠΈ, Π½Π΅ Π·Π°Π±Ρ‹Π²Π°ΠΉΡ‚Π΅, Ρ‡Ρ‚ΠΎ string являСтся ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΈΠΏΠ° для basic_string<char> (Π° wstring β€” для basic_string<wchar_t>), поэтому ΠΈΡΠΊΠ°Ρ‚ΡŒ слСдуСт Π² шаблонС basic_string. ВСроятно, ΠΏΡ€ΠΎΡ‰Π΅ всСго ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ ΠΊΠΎΠΏΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΌΡƒ конструктору класса. ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅, ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ Π»ΠΈ ΠΎΠ½ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ, которая ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ счСтчиком ссылок. Если такая пСрСмСнная Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°ΠΉΠ΄Π΅Π½Π°, string ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ подсчСт ссылок, Π° Ссли Π½Π΅Ρ‚ β€” Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚... ΠΈΠ»ΠΈ Π²Ρ‹ просто ошиблись ΠΏΡ€ΠΈ поискС.