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

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

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

string *ps = new string(10, '9'); // *ps = "9999999999"

// Π²Π΅ΠΊΡ‚ΠΎΡ€ Π½Π° Π΄Π΅ΡΡΡ‚ΡŒ элСмСнтов со значСниями ΠΎΡ‚ 0 Π΄ΠΎ 9

vector<int> *pv = new vector<int>{0,1,2,3,4,5,6,7,8,9};

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

string *ps1 = new string;  // инициализация ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ пустой строкой

string *ps = new string(); // инициализация Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ

                           // (пустой строкой)

int *pi1 = new int;        // инициализация ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ;

                           // Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ *pi1 Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ

int *pi2 = new int();      // инициализация Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ 0;

                           // *pi2 = 0

Для Ρ‚ΠΈΠΏΠΎΠ² классов (Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ string), ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰ΠΈΡ… собствСнныС конструкторы (см. Ρ€Π°Π·Π΄Π΅Π» 7.1.4), запрос ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ послСдствий; нСзависимо ΠΎΡ‚ Ρ„ΠΎΡ€ΠΌΡ‹, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ инициализируСтся стандартным конструктором. Π Π°Π·Π»ΠΈΡ‡ΠΈΠ΅ сущСствСнно Π² случаС встроСнных Ρ‚ΠΈΠΏΠΎΠ²: инициализация ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° встроСнного Ρ‚ΠΈΠΏΠ° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ присваиваСт Π΅ΠΌΡƒ Π²ΠΏΠΎΠ»Π½Π΅ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π° инициализация ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ β€” Π½Π΅Ρ‚. Π’ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΏΠΎΠ»Π°Π³Π°ΡŽΡ‰ΠΈΠ΅ΡΡ Π½Π° синтСзируСмый стандартный конструктор Ρ‡Π»Π΅Π½Ρ‹ класса встроСнного Ρ‚ΠΈΠΏΠ° Ρ‚Π°ΠΊΠΆΠ΅ Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Π½Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹, Ссли эти Ρ‡Π»Π΅Π½Ρ‹ Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ Π² Ρ‚Π΅Π»Π΅ класса (см. Ρ€Π°Π·Π΄Π΅Π» 7.1.4).

По Ρ‚Π΅ΠΌ ΠΆΠ΅ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, ΠΈΠΌΠ΅Π΅Ρ‚ смысл ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ динамичСски созданныС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹.

Когда прСдоставляСтся ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ Π² ΠΊΡ€ΡƒΠ³Π»Ρ‹Ρ… скобках, для Π²Ρ‹Π²ΠΎΠ΄Π° Ρ‚ΠΈΠΏΠ° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прСдстоит Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ для этого ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово auto (см. Ρ€Π°Π·Π΄Π΅Π» 2.5.2). Но, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ компилятор ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ‚ΠΈΠΏ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° для Π²Ρ‹Π²ΠΎΠ΄Π° Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°, ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово auto ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½Ρ‹ΠΌ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠΌ Π² ΠΊΡ€ΡƒΠ³Π»Ρ‹Ρ… скобках:

auto p1 = new auto(obj); // p ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° obj

                         // этот ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ инициализируСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ obj

auto p2 = new auto{a,b,c}; // ошибка: для ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° Π½ΡƒΠΆΠ½ΠΎ

                           // ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΡ€ΡƒΠ³Π»Ρ‹Π΅ скобки

Π’ΠΈΠΏ p1 β€” это ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° автоматичСски Π²Ρ‹Π²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ obj. Если obj ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ int, Ρ‚ΠΎ Ρ‚ΠΈΠΏ p1 β€” int*; Ссли obj ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ string, Ρ‚ΠΎ Ρ‚ΠΈΠΏ p1 β€” string* ΠΈ Ρ‚.Π΄. Π’Π½ΠΎΠ²ΡŒ созданный ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ инициализируСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° obj.

ДинамичСски созданныС константныС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹

Для рСзСрвирования константных ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π²ΠΏΠΎΠ»Π½Π΅ допустимо ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ new:

// Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ

const int const int *pci = new const int(1024);

// Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ

const string const string *pcs = new const string;

Подобно Π»ΡŽΠ±Ρ‹ΠΌ Π΄Ρ€ΡƒΠ³ΠΈΠΌ константным ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ, динамичСски созданный константный ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ слСдуСт ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. ДинамичСский константный ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° класса, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰Π΅Π³ΠΎ стандартный конструктор (см. Ρ€Π°Π·Π΄Π΅Π» 7.1.4), ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ нСявно. ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ‚ΠΈΠΏΠΎΠ² слСдуСт ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ явно. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ динамичСски Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ являСтся константой, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π½Ρ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ new ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ являСтся ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ Π½Π° константу (см. Ρ€Π°Π·Π΄Π΅Π» 2.4.2).

Π˜ΡΡ‡Π΅Ρ€ΠΏΠ°Π½ΠΈΠ΅ памяти

Π₯отя соврСмСнныС ΠΌΠ°ΡˆΠΈΠ½Ρ‹ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΎΠ³Ρ€ΠΎΠΌΠ½Ρ‹ΠΉ объСм памяти, всСгда сущСствуСт Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ исчСрпания динамичСской памяти. Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ всю Π΄ΠΎΡΡ‚ΡƒΠΏΠ½ΡƒΡŽ Π΅ΠΉ ΠΏΠ°ΠΌΡΡ‚ΡŒ, выраТСния с ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ new Π±ΡƒΠ΄ΡƒΡ‚ Ρ‚Π΅Ρ€ΠΏΠ΅Ρ‚ΡŒ Π½Π΅ΡƒΠ΄Π°Ρ‡Ρƒ. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Ссли ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ new нСспособСн Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹ΠΉ объСм памяти, ΠΎΠ½ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° bad_alloc (см. Ρ€Π°Π·Π΄Π΅Π» 5.6). Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΈΠ½ΡƒΡŽ Ρ„ΠΎΡ€ΠΌΡƒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° new, ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΡ€Π΅ΠΏΡΡ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ:

// ΠΏΡ€ΠΈ Π½Π΅ΡƒΠ΄Π°Ρ‡Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ new Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½ΡƒΠ»Π΅Π²ΠΎΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ

int *p1 = new int; // ΠΏΡ€ΠΈ Π½Π΅ΡƒΠ΄Π°Ρ‡Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ new ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚

                   // ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ std::bad_alloc

int *p2 = new (nothrow) int; // ΠΏΡ€ΠΈ Π½Π΅ΡƒΠ΄Π°Ρ‡Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ new Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚

                             // Π½ΡƒΠ»Π΅Π²ΠΎΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ

По ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ, рассматриваСмым Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 19.1.2, эта Ρ„ΠΎΡ€ΠΌΠ° ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° new упоминаСтся ΠΊΠ°ΠΊ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°ΡŽΡ‰ΠΈΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ new (placement new). Π’Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°ΡŽΡ‰Π΅Π³ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° new позволяСт ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹. Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС пСрСдаСтся ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ nothrow. ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° nothrow ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρƒ new ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ. Если эта Ρ„ΠΎΡ€ΠΌΠ° ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° new окаТСтся нСспособна Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹ΠΉ объСм памяти, ΠΎΠ½Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ Π½ΡƒΠ»Π΅Π²ΠΎΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ. Π’ΠΈΠΏΡ‹ bad_alloc ΠΈ nothrow ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ΅ new.

ОсвобоТдСниС динамичСской памяти

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ исчСрпаниС памяти, ΠΏΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ использования Π΅Π΅ слСдуСт Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмС. Для этого ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ delete, ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‰ΠΈΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° освобоТдаСмый ΠΎΠ±ΡŠΠ΅ΠΊΡ‚:

delete p; // p Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ Π½Π° динамичСски созданный ΠΎΠ±ΡŠΠ΅ΠΊΡ‚

          // ΠΈΠ»ΠΈ Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ

Подобно ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρƒ new, ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ delete выполняСт Π΄Π²Π° дСйствия: удаляСт ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹ΠΉ Π΅ΠΌΡƒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ, ΠΈ освобоТдаСт ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ памяти.

ЗначСния указатСля ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ delete

ΠŸΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρƒ delete ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π»ΠΈΠ±ΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π° динамичСски созданный ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π»ΠΈΠ±ΠΎ Π±Ρ‹Ρ‚ΡŒ Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ (см. Ρ€Π°Π·Π΄Π΅Π» 2.3.2). Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ удалСния указатСля Π½Π° ΠΎΠ±Π»Π°ΡΡ‚ΡŒ памяти, Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ Π½Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ new, ΠΈΠ»ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ удалСния значСния Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ указатСля нСпрСдсказуСм:

int i, *pi1 = &i, *pi2 = nullptr;

double *pd = new double(33), *pd2 = pd;

delete i;   // ошибка: i - Π½Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ

delete pi1; // нСпрСдсказуСмо: pi1 - Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ

delete pd;  // ok

delete pd2; // нСпрСдсказуСмо: ΠΏΠ°ΠΌΡΡ‚ΡŒ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ pd2,

            // ΡƒΠΆΠ΅ освобоТдСна

delete pi2; // ok: освобоТдСниС Π½ΡƒΠ»Π΅Π²ΠΎΠ³ΠΎ указатСля всСгда допустимо

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ сообщаСт ΠΎΠ± ошибкС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° delete i, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π·Π½Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ i β€” Π½Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ. Ошибки, связанныС с Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° delete для ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ pi1 ΠΈ pd2, ΠΊΠΎΠ²Π°Ρ€Π½Π΅ΠΉ: ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ компиляторы нСспособны Π²Ρ‹ΡΡΠ½ΠΈΡ‚ΡŒ, ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π»ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, созданный статичСски ΠΈΠ»ΠΈ динамичСски. Π’ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅ компилятор Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ, Π±Ρ‹Π»Π° Π»ΠΈ ΡƒΠΆΠ΅ освобоТдСна ΠΏΠ°ΠΌΡΡ‚ΡŒ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ. Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ компиляторов ΠΏΡ€ΠΈΠΌΠ΅Ρ‚ Ρ‚Π°ΠΊΠΈΠ΅ выраТСния delete, нСсмотря Π½Π° ΠΈΡ… ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ.

Π₯отя Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ константного ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΎ, сам ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π²ΠΏΠΎΠ»Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ΄Π°Π»Π΅Π½. Подобно Π»ΡŽΠ±Ρ‹ΠΌ динамичСским ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ, константный динамичСский ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ освобоТдаСтся Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° delete для указатСля, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎ Π½Π° этот ΠΎΠ±ΡŠΠ΅ΠΊΡ‚:

const int *pci = new const int(1024);

delete pci; // ok: удаляСт константный ΠΎΠ±ΡŠΠ΅ΠΊΡ‚

ДинамичСски созданныС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ освобоТдСны

Как ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎΡΡŒ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 12.1.1, управляСмая ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ shared_ptr ΠΏΠ°ΠΌΡΡ‚ΡŒ автоматичСски освобоТдаСтся ΠΏΡ€ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠΈ послСднСго указатСля shared_ptr. ДинамичСский ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, управляСмый ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ встроСнного Ρ‚ΠΈΠΏΠ°, сущСствуСт Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° ΠΊ областям памяти, управляСмой ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ встроСнных Ρ‚ΠΈΠΏΠΎΠ², Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ΄Π°Π»Π΅Π½ явно.

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰ΠΈΠ΅ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ (Π° Π½Π΅ ΠΈΠ½Ρ‚Π΅Π»Π»Π΅ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅) ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π½Π° области динамичСской памяти, Π²ΠΎΠ·Π»Π°Π³Π°ΡŽΡ‚ ΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²Π΅Π½Π½ΠΎΡΡ‚ΡŒ Π·Π° ΠΈΡ… ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ Π½Π° Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΡƒΡŽ сторону:

// Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° динамичСски созданный ΠΎΠ±ΡŠΠ΅ΠΊΡ‚

Foo* factory(Π’ arg) {

 // ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ соотвСтствСнно

 return new Foo(arg); // Π·Π° освобоТдСниС этой памяти ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚

                      // Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π°Ρ сторона

}

Подобно ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΉ вСрсии Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ factory() (см. Ρ€Π°Π·Π΄Π΅Π» 12.1.1), эта вСрсия Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π½ΠΎ Π½Π΅ удаляСт Π΅Π³ΠΎ. ΠžΡ‚Π²Π΅Ρ‚ΡΡ‚Π²Π΅Π½Π½ΠΎΡΡ‚ΡŒ Π·Π° освобоТдСниС памяти динамичСского ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ станСт большС Π½Π΅ Π½ΡƒΠΆΠ΅Π½, нСсСт Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π°Ρ сторона Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ factory(). К соТалСнию, Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π°Ρ сторона слишком часто Π·Π°Π±Ρ‹Π²Π°Π΅Ρ‚ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это:

void use_factory(Π’ arg) {

 Foo *p = factory(arg);

 // ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ p, Π½ΠΎ Π½Π΅ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ Π΅Π³ΠΎ