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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Ρ‹ программирования Π½Π° Π‘++. 101 ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ ΠΈ рСкомСндация». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 33

Автор Π“Π΅Ρ€Π± Π‘Π°Ρ‚Ρ‚Π΅Ρ€

Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ программистов ΠΈΠ½Ρ‚ΡƒΠΈΡ‚ΠΈΠ²Π½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°ΡŽΡ‚, ΠΏΠΎΡ‡Π΅ΠΌΡƒ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° using (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, using namespace A;) Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ загрязнСниС Π² случаС воздСйствия Π½Π° ΠΊΠΎΠ΄, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π·Π° Π½Π΅ΠΉ ΠΈ Π½Π΅ освСдомлСнный ΠΎ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ этой Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹: ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ эта Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΎΠ΄Π½ΠΎ пространство ΠΈΠΌΠ΅Π½ Π² Π΄Ρ€ΡƒΠ³ΠΎΠ΅, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Π΄Π°ΠΆΠ΅ Ρ‚Π΅ ΠΈΠΌΠ΅Π½Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎ сих ΠΏΠΎΡ€ Π½Π΅ Π±Ρ‹Π»ΠΈ Π²ΠΈΠ΄Π½Ρ‹, понятно, Ρ‡Ρ‚ΠΎ это ΠΌΠΎΠΆΠ΅Ρ‚ Π»Π΅Π³ΠΊΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ смысл ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ Π·Π° Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²ΠΎΠΉ ΠΊΠΎΠ΄Π°.

Но Π²ΠΎΡ‚ ΠΎΠ΄Π½Π° распространСнная ошибка: ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΡΡ‡ΠΈΡ‚Π°ΡŽΡ‚, Ρ‡Ρ‚ΠΎ использованиС объявлСния using Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ пространства ΠΈΠΌΠ΅Π½ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, using N::Widget;) Π²ΠΏΠΎΠ»Π½Π΅ бСзопасно. Однако это Π½Π΅ Ρ‚Π°ΠΊ. Π’Π°ΠΊΠΈΠ΅ объявлСния, ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ, опасны, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ Π±ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ½ΠΊΠΈΠΌ ΠΈ Ρ…ΠΈΡ‚Ρ€Ρ‹ΠΌ способом. Рассмотрим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄:

// Π€Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ 1

namespace A {

 int f(double);

}


// Π€Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ 2

namespace B {

 using A::f;

 void g();

}


// Π€Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ 3

namespace A {

 int f(int);

}


// Π€Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ 4

void Π’::g() {

 f(1); // какая ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΠ° Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Π²Π°Π½Π°?

}

Π—Π΄Π΅ΡΡŒ ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ объявлСниС using ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ список ΠΈΠΌΠ΅Π½ f Π² пространствС ΠΈΠΌΠ΅Π½ А Π² Ρ‚ΠΎΡ‚ ΠΌΠΎΠΌΠ΅Π½Ρ‚, ΠΊΠΎΠ³Π΄Π° это объявлСниС встрСчаСтся. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, какая ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΠ° Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΈΠ΄ΠΈΠΌΠ° Π² пространствС ΠΈΠΌΠ΅Π½ Π’, зависит ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, Π³Π΄Π΅ ΠΈΠΌΠ΅Π½Π½ΠΎ находится ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΈ Π² ΠΊΠ°ΠΊΠΎΠΌ порядкС ΠΎΠ½ скомбинирован. (Π—Π΄Π΅ΡΡŒ Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ€Π°Π·Π΄Π°Ρ‚ΡŒΡΡ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π°ΡŽΡ‰ΠΈΠΉ Ρ€Π΅Π² вашСй Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΉ сирСны β€” "Π—Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ ΠΎΡ‚ порядка Π΅ΡΡ‚ΡŒ Π·Π»ΠΎ!") Вторая ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΠ°, f(int), Π² большСй стСпСни соотвСтствуСт Π²Ρ‹Π·ΠΎΠ²Ρƒ f(1), Π½ΠΎ f(int) Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅Π²ΠΈΠ΄ΠΈΠΌΠ° для B::g, Ссли Π΅Π΅ объявлСниС окаТСтся послС объявлСния using.

Рассмотрим Π΄Π²Π° частных случая. ΠŸΡƒΡΡ‚ΡŒ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Ρ‹ 1, 2 ΠΈ 3 находятся Π² Ρ‚Ρ€Π΅Ρ… Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»Π°Ρ… s1.h, s2.h ΠΈ s3.h, Π° Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ 4 β€” Π² Ρ„Π°ΠΉΠ»Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ s4.срр, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹. Π’ΠΎΠ³Π΄Π° сСмантика B::g зависит ΠΎΡ‚ порядка, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ Π² s4.срр! Π’ частности:

β€’ Π΅ΡΠ»ΠΈ s3.h ΠΈΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄ s2.h, Ρ‚ΠΎ B::g Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ A::f(int);

β€’ ΠΈΠ½Π°Ρ‡Π΅ Ссли s1.h ΠΈΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄ s2.h, Ρ‚ΠΎ B::g Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ A::f(doublΠ΅);

β€’ ΠΈΠ½Π°Ρ‡Π΅ B::g Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ вовсС.

Π’ описанной ситуации имССтся ΠΎΠ΄ΠΈΠ½ Π²ΠΏΠΎΠ»Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ порядок, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ всС Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ Π΄ΠΎΠ»ΠΆΠ½ΠΎ.

Π”Π°Π²Π°ΠΉΡ‚Π΅ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ рассмотрим ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ, ΠΊΠΎΠ³Π΄Π° Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Ρ‹ 1, 2, 3 ΠΈ 4 находятся Π² Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ… Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»Π°Ρ… s1.h, s2.h, s3.h ΠΈ s4.h. Π’Π΅ΠΏΠ΅Ρ€ΡŒ всС становится сущСствСнно Ρ…ΡƒΠΆΠ΅: сСмантика B::g зависит ΠΎΡ‚ порядка Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² s4.h, Π½ΠΎ ΠΈ Π² любой ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ s4.h! Π’ частности, Ρ„Π°ΠΉΠ» Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ client_code.срр ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ Π² любом порядкС:

β€’ Π΅ΡΠ»ΠΈ s3.h ΠΈΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄ s2.h, Ρ‚ΠΎ B::g Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ A::f(int);

β€’ ΠΈΠ½Π°Ρ‡Π΅ Ссли s1.h ΠΈΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄ s2.h, Ρ‚ΠΎ B::g Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ A::f(doublΠ΅);

β€’ ΠΈΠ½Π°Ρ‡Π΅ B::g Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ вовсС.

Битуация стала Ρ…ΡƒΠΆΠ΅ ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Π΄Π²Π° Ρ„Π°ΠΉΠ»Π° Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ Π² Ρ€Π°Π·Π½ΠΎΠΌ порядкС. Π§Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚, Ссли client_code_1.срр Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ s1.h, s2.h ΠΈ s4.h Π² ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌ порядкС, a client_code_2.срр Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌ порядкС s3.h, s2.h ΠΈ s4.h? Π’ΠΎΠ³Π΄Π° B::g Π½Π°Ρ€ΡƒΡˆΠ°Π΅Ρ‚ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ ΠΎΠ΄Π½ΠΎΠ³ΠΎ опрСдСлСния (one definition rule β€” ODR), ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ Π΄Π²Π΅ Π½Π΅ΡΠΎΠ³Π»Π°ΡΡƒΡŽΡ‰ΠΈΠ΅ΡΡ нСсовмСстимыС Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π²Π΅Ρ€Π½Ρ‹ΠΌΠΈ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ: ΠΎΠ΄Π½Π° ΠΈΠ· Π½ΠΈΡ… пытаСтся Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ A::f(int), Π° вторая β€” A::f(doublΠ΅).

ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ ΠΈ объявлСния using для пространств ΠΈΠΌΠ΅Π½ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»Π°Ρ… Π»ΠΈΠ±ΠΎ ΠΏΠ΅Ρ€Π΅Π΄ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²ΠΎΠΉ #include Π² Ρ„Π°ΠΉΠ»Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ. Π’ случаС Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΡ этого ΠΏΡ€Π°Π²ΠΈΠ»Π° Π²Ρ‹ нСсСтС ΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²Π΅Π½Π½ΠΎΡΡ‚ΡŒ Π·Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ смысла ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ Π·Π° using ΠΊΠΎΠ΄Π°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, вслСдствиС загрязнСния пространства ΠΈΠΌΠ΅Π½ ΠΈΠ»ΠΈ Π½Π΅ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ списка ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… ΠΈΠΌΠ΅Π½. (ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° "Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ ΠΈ объявлСния using для пространств ΠΈΠΌΠ΅Π½". Π£ΠΊΠ°Π·Π°Π½Π½ΠΎΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ Π½Π΅ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΠΎ ΠΏΡ€ΠΈ описании Ρ‡Π»Π΅Π½Π° класса с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ объявлСния using для внСсСния, ΠΏΡ€ΠΈ нСобходимости, ΠΈΠΌΠ΅Π½ ΠΈΠ· Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса.)

Π’ΠΎ всСх Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»Π°Ρ…, ΠΊΠ°ΠΊ ΠΈ Π² Ρ„Π°ΠΉΠ»Π°Ρ… Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π΄ΠΎ послСднСй Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ #include, всСгда ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ явныС ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΈΠΌΠ΅Π½Π°. Π’ Ρ„Π°ΠΉΠ»Π°Ρ… Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ послС всСх Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ² #include Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ свободно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ ΠΈ объявлСния using. Π­Ρ‚ΠΎ Π²Π΅Ρ€Π½Ρ‹ΠΉ способ сочСтания краткости ΠΊΠΎΠ΄Π° с ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ.

Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ

ΠŸΠ΅Ρ€Π΅Π½Π΅ΡΠ΅Π½ΠΈΠ΅ большого ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° со старой Π΄ΠΎ-ANSI/ISO Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ (всС ΠΈΠΌΠ΅Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ находятся Π² глобальном пространствС ΠΈΠΌΠ΅Π½) ΠΊ использованию Π½ΠΎΠ²ΠΎΠΉ (Π³Π΄Π΅ практичСски всС ΠΈΠΌΠ΅Π½Π° находятся Π² пространствС ΠΈΠΌΠ΅Π½ std) ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ вас Π°ΠΊΠΊΡƒΡ€Π°Ρ‚Π½ΠΎ Ρ€Π°Π·ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρƒ using Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅. Π­Ρ‚ΠΎΡ‚ способ описан Π² [Sutter02].

Бсылки

[Stroustrup00] Β§9.2.1 β€’ [Sutter02] Β§39-40

60. Π˜Π·Π±Π΅Π³Π°ΠΉΡ‚Π΅ выдСлСния ΠΈ освобоТдСния памяти Π² Ρ€Π°Π·Π½Ρ‹Ρ… модулях

РСзюмС

Π—ΠΎΠ»ΠΎΡ‚ΠΎΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ программиста β€” ΠΏΠΎΠ»ΠΎΠΆΠΈ, Π³Π΄Π΅ взял. Π’Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΌΠΎΠ΄ΡƒΠ»Π΅, Π° освобоТдСниС Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ Π΄Π΅Π»Π°Π΅Ρ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π±ΠΎΠ»Π΅Π΅ Ρ…Ρ€ΡƒΠΏΠΊΠΎΠΉ, создавая Ρ‚ΠΎΠ½ΠΊΡƒΡŽ дальнюю Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ ΠΌΠ΅ΠΆΠ΄Ρƒ этими модулями. Π’Π°ΠΊΠΈΠ΅ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ ΠΎΠ΄Π½ΠΎΠΉ ΠΈ Ρ‚ΠΎΠΉ ΠΆΠ΅ вСрсиСй компилятора с ΠΎΠ΄Π½ΠΈΠΌΠΈ ΠΈ Ρ‚Π΅ΠΌΠΈ ΠΆΠ΅ Ρ„Π»Π°Π³Π°ΠΌΠΈ (Π² частности, ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½Ρ‹Π΅ вСрсии ΠΈ вСрсии NDEBUG) ΠΈ с ΠΎΠ΄Π½ΠΎΠΉ ΠΈ Ρ‚ΠΎΠΉ ΠΆΠ΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ; ΠΊΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, с практичСской Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния Π»ΡƒΡ‡ΡˆΠ΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ, Π²Ρ‹Π΄Π΅Π»ΡΡŽΡ‰ΠΈΠΉ ΠΏΠ°ΠΌΡΡ‚ΡŒ, оставался Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½ ΠΏΡ€ΠΈ Π΅Π΅ освобоТдСнии.

ΠžΠ±ΡΡƒΠΆΠ΄Π΅Π½ΠΈΠ΅

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

Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ освобоТдСния памяти (Ρ‚.Π΅. ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π΅ ::operator delete ΠΈΠ»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ std::free) ΠΏΡ€ΠΈ пСрСсСчСнии Π³Ρ€Π°Π½ΠΈΡ† ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ практичСски нСльзя ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΊΠ°ΠΊΠΈΠ΅-Π»ΠΈΠ±ΠΎ прСдполоТСния, Π² особСнности ΠΏΡ€ΠΈ пСрСсСчСнии Π³Ρ€Π°Π½ΠΈΡ† ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π²Ρ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ скомпилированы ΠΎΠ΄Π½ΠΈΠΌ ΠΈ Ρ‚Π΅ΠΌ ΠΆΠ΅ компилятором Π‘++ с ΠΎΠ΄Π½ΠΈΠΌΠΈ ΠΈ Ρ‚Π΅ΠΌΠΈ ΠΆΠ΅ опциями. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, часто эти ΠΌΠΎΠ΄ΡƒΠ»ΠΈ находятся Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈ Ρ‚ΠΎΠΌ ΠΆΠ΅ Ρ„Π°ΠΉΠ»Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΡŽΡ‚ΡΡ с ΠΎΠ΄Π½ΠΈΠΌΠΈ ΠΈ Ρ‚Π΅ΠΌΠΈ ΠΆΠ΅ опциями, Π½ΠΎ ΠΊΠΎΠΌΡ„ΠΎΡ€Ρ‚ часто ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ забывчивости. Π’ особСнности высока Ρ†Π΅Π½Π° Ρ‚Π°ΠΊΠΎΠΉ забывчивости ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π΅ ΠΊ динамичСски связываСмым Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌ, распрСдСлСнии большого ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΌΠ΅ΠΆΠ΄Ρƒ нСсколькими Π³Ρ€ΡƒΠΏΠΏΠ°ΠΌΠΈ ΠΈΠ»ΠΈ ΠΏΡ€ΠΈ Π·Π°ΠΌΠ΅Π½Π΅ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ "Π½Π° Ρ…ΠΎΠ΄Ρƒ" β€” Π² этом случаС Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΠ΄Π΅Π»ΠΈΡ‚ΡŒ максимум внимания Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΈ освобоТдСниС памяти Π²Ρ‹ΠΏΠΎΠ»Π½ΡΠ»ΠΎΡΡŒ Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… ΠΎΠ΄Π½ΠΎΠ³ΠΎ модуля ΠΈΠ»ΠΈ подсистСмы.

Π₯ΠΎΡ€ΠΎΡˆΠΈΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ обСспСчСния освобоТдСния памяти ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ являСтся использованиС shared_ptr (см. [C++TR104]). Π˜Π½Ρ‚Π΅Π»Π»Π΅ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ shared_ptr со счСтчиком ссылок ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Ρ…Π²Π°Ρ‚ΠΈΡ‚ΡŒ свой "ΡƒΠ΄Π°Π»ΠΈΡ‚Π΅Π»ΡŒ" Π² процСссС конструирования. "Π£Π΄Π°Π»ΠΈΡ‚Π΅Π»ΡŒ" β€” это Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ (ΠΈΠ»ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ выполняСт освобоТдСниС памяти. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ упомянутый Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΈΠ»ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, являСтся Ρ‡Π°ΡΡ‚ΡŒΡŽ состояния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° shared_ptr, ΠΌΠΎΠ΄ΡƒΠ»ΡŒ, Π²Ρ‹Π΄Π΅Π»ΠΈΠ²ΡˆΠΈΠΉ ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ, ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ освобоТдСния памяти, ΠΈ эта функция Π±ΡƒΠ΄Π΅Ρ‚ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ Π²Ρ‹Π·Π²Π°Π½Π°, Π΄Π°ΠΆΠ΅ Ссли Ρ‚ΠΎΡ‡ΠΊΠ° освобоТдСния находится Π³Π΄Π΅-Ρ‚ΠΎ Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ ΠΌΠΎΠ΄ΡƒΠ»Π΅ β€” вСроятно, ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ нСбольшой Ρ†Π΅Π½ΠΎΠΉ (ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΡΡ‚ΡŒ Π²Π°ΠΆΠ½Π΅Π΅ Ρ†Π΅Π½Ρ‹; см. Ρ‚Π°ΠΊΠΆΠ΅ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΈ 5, 6 ΠΈ 8). ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, исходный ΠΌΠΎΠ΄ΡƒΠ»ΡŒ ΠΏΡ€ΠΈ этом Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΡΡ‚Π°Π²Π°Ρ‚ΡŒΡΡ Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹ΠΌ.

Бсылки

[Π‘++TR104]

61. НС опрСдСляйтС Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ со связываниСм

РСзюмС

ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ со связываниСм, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈΠ»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ уровня пространства ΠΈΠΌΠ΅Π½, ΠΎΠ±Π»Π°Π΄Π°ΡŽΡ‚ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ для Π½ΠΈΡ… ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ. ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ‚Π°ΠΊΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»Π°Ρ… ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ Π»ΠΈΠ±ΠΎ ΠΊ ошибкам Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ, Π»ΠΈΠ±ΠΎ ΠΊ бСсполСзному расходу памяти. ΠŸΠΎΠΌΠ΅Ρ‰Π°ΠΉΡ‚Π΅ всС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ со связываниСм Π² Ρ„Π°ΠΉΠ»Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ.

ΠžΠ±ΡΡƒΠΆΠ΄Π΅Π½ΠΈΠ΅

Когда ΠΌΡ‹ Π½Π°Ρ‡ΠΈΠ½Π°Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π‘++, Ρ‚ΠΎ всС достаточно быстро уясняСм, Ρ‡Ρ‚ΠΎ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» Π½Π°ΠΏΠΎΠ΄ΠΎΠ±ΠΈΠ΅

// Π˜Π·Π±Π΅Π³Π°ΠΉΡ‚Π΅ опрСдСлСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² с внСшним

// связываниСм Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅

int fudgeFactor;

string hello("hello, world!");

void foo() { /* ... */ }

Π±ΡƒΠ΄ΡƒΡ‡ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ большС Ρ‡Π΅ΠΌ Π² ΠΎΠ΄ΠΈΠ½ исходный Ρ„Π°ΠΉΠ», Π²Π΅Π΄Π΅Ρ‚ ΠΏΡ€ΠΈ компиляции ΠΊ ошибкам дублирования символов Π²ΠΎ врСмя ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ. ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π° проста: ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ исходный Ρ„Π°ΠΉΠ» Π² Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ опрСдСляСт ΠΈ выдСляСт пространство для fudgeFactor, hello ΠΈ Ρ‚Π΅Π»Π° foo, ΠΈ ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ врСмя сборки (ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ, ΠΈΠ»ΠΈ связывания), ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Ρ‰ΠΈΠΊ сталкиваСтся с Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ΠΌ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ носят ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅ имя ΠΈ Π±ΠΎΡ€ΡŽΡ‚ΡΡ ΠΌΠ΅ΠΆΠ΄Ρƒ собой Π·Π° Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ. РСшСниС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ простоС β€” Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» Π½Π°Π΄ΠΎ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ объявлСния: