Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти Π² c

ДинамичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти

malloc

Π’ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ Π³Π»Π°Π²Π΅ ΡƒΠΆΠ΅ ΠΎΠ±ΡΡƒΠΆΠ΄Π°Π»ΠΎΡΡŒ, Ρ‡Ρ‚ΠΎ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ кладутся Π½Π° стСк ΠΈ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° ΠΌΡ‹ Π½Π΅ Π²Ρ‹ΡˆΠ»ΠΈ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π‘ ΠΎΠ΄Π½ΠΎΠΉ стороны, это позволяСт автоматичСски ΠΎΡ‡ΠΈΡ‰Π°Ρ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ, с Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, сущСствуСт Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, врСмя ΠΆΠΈΠ·Π½ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ динамичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти, ΠΊΠΎΠ³Π΄Π° Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ пространства Π·Π°Ρ€Π°Π½Π΅Π΅ Π½Π΅ извСстСн. Для этого ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти Π½Π° ΠΊΡƒΡ‡Π΅. НСдостатков Ρƒ Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° Π΄Π²Π°: Π²ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, ΠΏΠ°ΠΌΡΡ‚ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΠΎΡ‡ΠΈΡ‰Π°Ρ‚ΡŒ, Π²ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, Π²Ρ‹Π΄Π΅Π΅Π½ΠΈΠ΅ памяти – достаточно дорогостоящая опСрация.

Для выдСлСния памяти Π½Π° ΠΊΡƒΡ‡Π΅ Π² си ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ функция malloc (memory allocation) ΠΈΠ· Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ stdlib.h

Ѐункция выдСляСт size Π±Π°ΠΉΡ‚ΠΎΠ² памяти ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Π½Π΅Ρ‘. Если ΠΏΠ°ΠΌΡΡ‚ΡŒ Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ Π½Π΅ ΡƒΠ΄Π°Π»ΠΎΡΡŒ, Ρ‚ΠΎ функция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ NULL. Π’Π°ΠΊ ΠΊΠ°ΠΊ malloc Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Ρ‚ΠΈΠΏΠ° void, Ρ‚ΠΎ Π΅Π³ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ явно ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊ Π½ΡƒΠΆΠ½ΠΎΠΌΡƒ Π½Π°ΠΌ Ρ‚ΠΈΠΏΡƒ. НапримСр, создадим ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ, послС этого Π²Ρ‹Π΄Π΅Π»ΠΈΠΌ ΠΏΠ°ΠΌΡΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ Π² 100 Π±Π°ΠΉΡ‚.

ПослС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΌΡ‹ ΠΏΠΎΡ€Π°Π±ΠΎΡ‚Π°Π»ΠΈ с ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ free.
Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ, ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ ΠΊΠ°ΠΊ с массивом. ΠŸΡ€ΠΈΠΌΠ΅Ρ€: ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π²Π²ΠΎΠ΄ΠΈΡ‚ число – Ρ€Π°Π·ΠΌΠ΅Ρ€ массива, создаём массив этого Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΈ заполняСм Π΅Π³ΠΎ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π°ΠΌΠΈ чисСл ΠΏΠΎ порядку. ПослС этого Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌ ΠΈ удаляСм массив.

Π—Π΄Π΅ΡΡŒ (int *) – ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠΎΠ². ПишСм Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅ Ρ‚ΠΈΠΏ, ΠΊΠ°ΠΊ ΠΈ Ρƒ указатСля.
size * sizeof(int) – сколько Π±Π°ΠΉΡ‚ Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ. sizeof(int) – Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΎΠ΄Π½ΠΎΠ³ΠΎ элСмСнта массива.
ПослС этого Ρ€Π°Π±ΠΎΡ‚Π°Π΅ΠΌ с ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ с массивом. Π’ ΠΊΠΎΠ½Ρ†Π΅ Π½Π΅ Π·Π°Π±Ρ‹Π²Π°Π΅ΠΌ ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ прСдставим Π½Π° рисункС, Ρ‡Ρ‚ΠΎ Ρƒ нас происходило. ΠŸΡƒΡΡ‚ΡŒ ΠΌΡ‹ Π²Π²Π΅Π»ΠΈ число 5.

Ѐункция malloc Π²Ρ‹Π΄Π΅Π»ΠΈΠ»Π° ΠΏΠ°ΠΌΡΡ‚ΡŒ Π½Π° ΠΊΡƒΡ‡Π΅ ΠΏΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠΌΡƒ адрСсу, послС Ρ‡Π΅Π³ΠΎ Π²Π΅Ρ€Π½ΡƒΠ»Π° Π΅Π³ΠΎ. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ p Ρ…Ρ€Π°Π½ΠΈΡ‚ этот адрСс ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для Ρ€Π°Π±ΠΎΡ‚Ρ‹. Π’ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ΅, ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΈ Π»ΡŽΠ±Ρ‹ΠΌ Π΄Ρ€ΡƒΠ³ΠΈΠΌ адрСсом.
Когда функция malloc «Π²Ρ‹Π΄Π΅Π»ΡΠ΅Ρ‚ ΠΏΠ°ΠΌΡΡ‚ΡŒ», Ρ‚ΠΎ ΠΎΠ½Π° Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΡƒΠ΅Ρ‚ мСсто Π½Π° ΠΊΡƒΡ‡Π΅ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ адрСс этого участка. Π£ нас Π±ΡƒΠ΄Π΅Ρ‚ гарантия, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ Π½Π΅ отдаст Π½Π°ΡˆΡƒ ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΊΠΎΠΌΡƒ-Ρ‚ΠΎ Π΅Ρ‰Ρ‘. Когда ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ free, Ρ‚ΠΎ ΠΌΡ‹ освобоТдаСм ΠΏΠ°ΠΌΡΡ‚ΡŒ, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Ρƒ, Ρ‡Ρ‚ΠΎ эта ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ использована ΠΊΠ΅ΠΌ-Ρ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΠΌ. Он ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½Π°ΡˆΡƒ ΠΏΠ°ΠΌΡΡ‚ΡŒ, Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈ Π½Π΅Ρ‚, Π½ΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Ρƒ нас ΡƒΠΆΠ΅ Π½Π΅Ρ‚ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΠΈ, Ρ‡Ρ‚ΠΎ эта ΠΏΠ°ΠΌΡΡ‚ΡŒ наша. ΠŸΡ€ΠΈ этом сама пСрСмСнная Π½Π΅ зануляСтся, ΠΎΠ½Π° ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ адрСс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Ρ€Π°Π½Π΅Π΅ пользовалась.

Π­Ρ‚ΠΎ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΡ…ΠΎΠΆΠ΅ Π½Π° ΡΡŠΡ‘ΠΌ Π½ΠΎΠΌΠ΅Ρ€Π° Π² ΠΎΡ‚Π΅Π»Π΅. ΠœΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Π΄ΡƒΠ±Π»ΠΈΠΊΠ°Ρ‚ ΠΊΠ»ΡŽΡ‡Π° ΠΎΡ‚ Π½ΠΎΠΌΠ΅Ρ€Π°, ΠΆΠΈΠ²Ρ‘ΠΌ Π² Π½Ρ‘ΠΌ, Π° ΠΏΠΎΡ‚ΠΎΠΌ сдаём ΠΊΠΎΠΌΠ½Π°Ρ‚Ρƒ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ. Но Π΄ΡƒΠ±Π»ΠΈΠΊΠ°Ρ‚ ΠΊΠ»ΡŽΡ‡Π° Ρƒ нас остаётся. ВсСгда ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΉΡ‚ΠΈ Π² этот Π½ΠΎΠΌΠ΅Ρ€, Π½ΠΎ Π² Π½Ρ‘ΠΌ ΡƒΠΆΠ΅ ΠΊΡ‚ΠΎ-Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΆΠΈΡ‚ΡŒ. Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ наша ΠΎΠ±ΡΠ·Π°Π½Π½ΠΎΡΡ‚ΡŒ – ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ Π΄ΡƒΠ±Π»ΠΈΠΊΠ°Ρ‚.

Иногда Π΄ΡƒΠΌΠ°ΡŽΡ‚, Ρ‡Ρ‚ΠΎ происходит «ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅» ΠΈΠ»ΠΈ «ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅» памяти. На самом Π΄Π΅Π»Π΅ происходит Ρ‚ΠΎΠ»ΡŒΠΊΠΎ пСрСраспрСдСлСниС рСсурсов.

ОсвобоТдСниС памяти с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ free

Π’ Π΅ΠΏΠ΅Ρ€ΡŒ рассмотри, ΠΊΠ°ΠΊ происходит освобоТдСниС памяти. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Ρ…Ρ€Π°Π½ΠΈΡ‚ адрСс области памяти, начиная с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΎΠ½Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ. Однако, ΠΎΠ½Π° Π½Π΅ Ρ…Ρ€Π°Π½ΠΈΡ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° этой области. ΠžΡ‚ΠΊΡƒΠ΄Π° Ρ‚ΠΎΠ³Π΄Π° функция free Π·Π½Π°Π΅Ρ‚, сколько памяти Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ?

Π Π°Π±ΠΎΡ‚Π° с Π΄Π²ΡƒΠΌΠ΅Ρ€Π½Ρ‹ΠΌΠΈ ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠΌΠ΅Ρ€Π½Ρ‹ΠΌΠΈ массивами

Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ «Ρ‚Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ» массив ΠΈ Π·Π°ΠΏΠΎΠ»Π½ΠΈΠΌ Π΅Π³ΠΎ значСниями

Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ‚Ρ€Ρ‘Ρ…ΠΌΠ΅Ρ€Π½Ρ‹ΠΉ массив, ΠΏΠΎ Π°Π½Π°Π»ΠΎΠ³ΠΈΠΈ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ сначала ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ, послС Ρ‡Π΅Π³ΠΎ Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΏΠΎΠ΄ массив ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π° ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ, послС Ρ‡Π΅Π³ΠΎ ΠΏΡ€ΠΎΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· массивов ΠΈ Ρ‚.Π΄.

calloc

Π€ ункция calloc выдСляСт n ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ m ΠΈ заполняСт ΠΈΡ… нулями. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ ΠΎΠ½Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выдСлСния памяти ΠΏΠΎΠ΄ массивы. Бинтаксис

realloc

Π• Ρ‰Ρ‘ ΠΎΠ΄Π½Π° ваТная функция – realloc (re-allocation). Она позволяСт ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ Ρ€Π°Π½Π΅Π΅ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ памяти ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² старый ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ΠΈ Π½ΠΎΠ²Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ памяти Π² Π±Π°ΠΉΡ‚Π°Ρ…:

Ѐункция realloc ΠΌΠΎΠΆΠ΅Ρ‚ ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°Π½Π΅Π΅ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ участок памяти, Ρ‚Π°ΠΊ ΠΈ Π½ΠΎΠ²Ρ‹ΠΉ. ΠŸΡ€ΠΈ этом Π½Π΅ Π²Π°ΠΆΠ½ΠΎ, мСньшС ΠΈΠ»ΠΈ большС Π½ΠΎΠ²Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ – ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ памяти сам Ρ€Π΅ΡˆΠ°Π΅Ρ‚, Π³Π΄Π΅ Π²Ρ‹Π΄Π΅Π»ΡΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ.
ΠŸΡ€ΠΈΠΌΠ΅Ρ€ – ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π²Π²ΠΎΠ΄ΠΈΡ‚ слова. Для Π½Π°Ρ‡Π°Π»Π° выдСляСм ΠΏΠΎΠ΄ слова массив Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ 10. Если ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π²Π²Ρ‘Π» большС слов, Ρ‚ΠΎ измСняСм Π΅Π³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ…Π²Π°Ρ‚ΠΈΠ»ΠΎ мСста. Когда ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π²Π²ΠΎΠ΄ΠΈΡ‚ слово end, ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‰Π°Π΅ΠΌ Π²Π²ΠΎΠ΄ ΠΈ Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌ Π½Π° ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ всС слова.

Π₯ΠΎΡ‡Ρƒ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΏΡ€ΠΈ Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠΈ памяти пишСм sizeof(char*), ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€ указатСля Π½Π° char Π½Π΅ Ρ€Π°Π²Π΅Π½ ΠΎΠ΄Π½ΠΎΠΌΡƒ Π±Π°ΠΉΡ‚Ρƒ, ΠΊΠ°ΠΊ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Ρ‚ΠΈΠΏΠ° char.

Ошибки ΠΏΡ€ΠΈ Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠΈ памяти

1. Π‘Ρ‹Π²Π°Π΅Ρ‚ ситуация, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΠ°ΠΌΡΡ‚ΡŒ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π°. Π’ этом случаС функция malloc (ΠΈ calloc) Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ NULL. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ, ΠΏΠ΅Ρ€Π΅Π΄ Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ памяти Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠ±Π½ΡƒΠ»ΠΈΡ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ, Π° послС выдСлСния ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, Π½Π΅ Ρ€Π°Π²Π΅Π½ Π»ΠΈ ΠΎΠ½ NULL. Π’Π°ΠΊ ΠΆΠ΅ Π²Π΅Π΄Ρ‘Ρ‚ сСбя ΠΈ realloc. Когда ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ free ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ Π½Π° NULL Π½Π΅Ρ‚ нСобходимости, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ согласно Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ free(NULL) Π½Π΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… дСйствий. ΠŸΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΊ послСднСму ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ:

Π₯ΠΎΡ‚Π΅Π»ΠΎΡΡŒ Π±Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ошибки выдСлСния памяти ΠΌΠΎΠ³ΡƒΡ‚ ΡΠ»ΡƒΡ‡ΠΈΡ‚ΡŒΡΡ, ΠΈ просто Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΈΠ· прилоТСния ΠΈ Π²Ρ‹ΠΊΠΈΠ΄Ρ‹Π²Π°Ρ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΊΡƒ ΠΏΠ»ΠΎΡ…ΠΎ. РСшСниС зависит ΠΎΡ‚ ситуации. НапримСр, Ссли Π½Π΅ Ρ…Π²Π°Ρ‚Π°Π΅Ρ‚ памяти, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΠΎΠΆΠ΄Π°Ρ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ врСмя ΠΈ послС этого ΠΎΠΏΡΡ‚ΡŒ ΠΏΠΎΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ, ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ хранСния Ρ„Π°ΠΉΠ» ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Ρ‚ΡƒΠ΄Π° Ρ‡Π°ΡΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². Или Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ очистку, сократив ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΈ ΡƒΠ΄Π°Π»ΠΈΠ² Π½Π΅Π½ΡƒΠΆΠ½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ссли ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Ρ…Ρ€Π°Π½ΠΈΡ‚ адрСс, Ρ‚ΠΎ Π΅Π³ΠΎ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ. Для Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π»ΡƒΡ‡ΡˆΠ΅ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ, с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ дальшС.

3. ИспользованиС освобоТдённой области. ΠŸΠΎΡ‡Π΅ΠΌΡƒ это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π² си, описано Π²Ρ‹ΡˆΠ΅. Π­Ρ‚Π° ошибка выливаСтся Π² Π΄Ρ€ΡƒΠ³ΡƒΡŽ – Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Π΅ висячиС ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ (dangling pointers ΠΈΠ»ΠΈ wild pointers). Π’Ρ‹ удаляСтС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π½ΠΎ ΠΏΡ€ΠΈ этом Π·Π°Π±Ρ‹Π²Π°Π΅Ρ‚Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ указатСля Π½Π° NULL. Π’ ΠΈΡ‚ΠΎΠ³Π΅, ΠΎΠ½ Ρ…Ρ€Π°Π½ΠΈΡ‚ адрСс области памяти, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΡƒΠΆΠ΅ нСльзя Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ, ΠΏΡ€ΠΈ этом ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, валидная эта ΠΎΠ±Π»Π°ΡΡ‚ΡŒ ΠΈΠ»ΠΈ Π½Π΅Ρ‚, Ρƒ нас Π½Π΅Ρ‚ возмоТности.

Π­Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΎΡ‚Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΈ Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚ мусор, ΠΈΠ»ΠΈ Π½Π΅ мусор, ΠΈΠ»ΠΈ Π½Π΅ Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚. ПовСдСниС Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ.

Если ΠΆΠ΅ ΠΌΡ‹ напишСм

Ρ‚ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π²Ρ‹ΠΊΠΈΠ½Π΅Ρ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅. Π­Ρ‚ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎ Π»ΡƒΡ‡ΡˆΠ΅, Ρ‡Π΅ΠΌ Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅. Если Π²Ρ‹ освобоТдаСтС ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π² дальнСйшСм, Ρ‚ΠΎ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΠ±Π½ΡƒΠ»ΠΈΡ‚Π΅ Π΅Π³ΠΎ.

4. ОсвобоТдСниС освобоТдённой памяти. ΠŸΡ€ΠΈΠΌΠ΅Ρ€

5. ΠžΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ Ρ€Π°Π±ΠΎΡ‚Π° с двумя указатСлями Π½Π° ΠΎΠ΄Π½Ρƒ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ памяти. ΠŸΡƒΡΡ‚ΡŒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρƒ нас Π΄Π²Π° указатСля p1 ΠΈ p2. Если ΠΏΠΎΠ΄ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π±Ρ‹Π»Π° Π²Ρ‹Π΄Π΅Π»Π΅Π½Π° ΠΏΠ°ΠΌΡΡ‚ΡŒ, Ρ‚ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ запросто ΡΠΊΠΎΠΌΠΏΡ€ΠΎΠΌΠ΅Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ эту ΠΎΠ±Π»Π°ΡΡ‚ΡŒ:

Рассмотрим ΠΊΠΎΠ΄ Π΅Ρ‰Ρ‘ Ρ€Π°Π·.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΎΠ±Π° указатСля хранят ΠΎΠ΄ΠΈΠ½ адрСс.

А Π²ΠΎΡ‚ здСсь происходит Π½Π΅ΠΏΡ€Π΅Π΄Π²ΠΈΠ΄Π΅Π½Π½ΠΎΠ΅. ΠœΡ‹ Ρ€Π΅ΡˆΠΈΠ»ΠΈ Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄ p2 Π½ΠΎΠ²Ρ‹ΠΉ участок памяти. realloc Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ сохранСниС ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π°, Π½ΠΎ Π²ΠΎΡ‚ сам ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ p1 ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΡΡ‚Π°Ρ‚ΡŒ Π±Ρ‹Ρ‚ΡŒ Π²Π°Π»ΠΈΠ΄Π½Ρ‹ΠΌ. Π•ΡΡ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ ситуации. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, Π²Ρ‹Π·ΠΎΠ² malloc ΠΌΠΎΠ³ Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ памяти, Ρ‡Π°ΡΡ‚ΡŒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ. ПослС Π²Ρ‹Π·ΠΎΠ²Π° Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ помСняСтся ΠΈ p1 ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ ΠΎΡΡ‚Π°Π²Π°Ρ‚ΡŒΡΡ Π²Π°Π»ΠΈΠ΄Π½Ρ‹ΠΌ. Если ΠΆΠ΅ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»ΠΎΡΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Ρ‚ΠΎ p1 ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π° Π½Π΅Π²Π°Π»ΠΈΠ΄Π½Ρ‹ΠΉ адрСс (ΠΈΠΌΠ΅Π½Π½ΠΎ это с большой Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒΡŽ ΠΈ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Ρ‘Ρ‚ Π² нашСм случаС). Π’ΠΎΠ³Π΄Π° p1 Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚ мусор (ΠΈΠ»ΠΈ ΠΆΠ΅ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Ρ‘Ρ‚ ошибка, Ссли p1 ΠΏΠΎΠ»Π΅Π·Π΅Ρ‚ Π² Π½Π΅Π΄ΠΎΡΡ‚ΡƒΠΏΠ½ΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ), Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ p2 Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚ староС содСрТимоС p1. Π’ этом случаС ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ.

Π”Π²Π° указатСля Π½Π° ΠΎΠ΄Π½Ρƒ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ памяти это Π²ΠΎΠΎΠ±Ρ‰Π΅-Ρ‚ΠΎ Π½Π΅ ошибка. Π‘Ρ‹Π²Π°ΡŽΡ‚ ситуации, ΠΊΠΎΠ³Π΄Π° Π±Π΅Π· Π½ΠΈΡ… Π½Π΅ ΠΎΠ±ΠΎΠΉΡ‚ΠΈΡΡŒ. Но это ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠ΅ ΠΌΠΈΠ½Π½ΠΎΠ΅ ΠΏΠΎΠ»Π΅ для программиста.

Π Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ realloc ΠΈ malloc.

ΠŸΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ malloc, realloc ΠΈ calloc с Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ. Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Ρ‘Π½ ΠΊΠ°ΠΊ NULL, Ρ‚Π°ΠΊ ΠΈ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ адрСс. Им ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ, Π½ΠΎ ΠΊ Π½Π΅ΠΌΡƒ нСльзя ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ разадрСсации.
Π’Ρ‹Π·ΠΎΠ² realloc(NULL, size_t) эквивалСнтС Π²Ρ‹Π·ΠΎΠ²Ρƒ malloc(size_t).
Однако, Π²Ρ‹Π·ΠΎΠ² realloc(NULL, 0) Π½Π΅ эквивалСнтСн Π²Ρ‹Π·ΠΎΠ²Ρƒ malloc(0) πŸ™‚ ΠŸΠΎΠ½ΠΈΠΌΠ°ΠΉΡ‚Π΅ это, ΠΊΠ°ΠΊ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹

ΠŸΡƒΡΡ‚ΡŒ Π΅ΡΡ‚ΡŒ ряд
1, 4, 4, 6, 7, 8, 9, 11, 12, 11, 15
Π’ΠΎΠ³Π΄Π° Ссли ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ срСднСго Π±ΡƒΠ΄Π΅Ρ‚ 3, Ρ‚ΠΎ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ ряд
(1+4+4)/3, (4+4+6)/3, (4+6+7)/3, (6+7+8)/3, (7+8+9)/3, (8+9+11)/3, (9+11+12)/3, (11+12+11)/3, (12+11+15)/3
Π’ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ сумма находится Π² «ΠΎΠΊΠ½Π΅», ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΡΠΊΠΎΠ»ΡŒΠ·ΠΈΡ‚ ΠΏΠΎ ряду. ВмСсто Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· Π² Ρ†ΠΈΠΊΠ»Π΅ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ сумму, ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π΅Ρ‘ для ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ ΠΏΠ΅Ρ€ΠΈΠΎΠ΄Π°, Π° Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΈΠ· суммы ΠΊΡ€Π°ΠΉΠ½Π΅Π΅ Π»Π΅Π²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ ΠΏΠ΅Ρ€ΠΈΠΎΠ΄Π° ΠΈ ΠΏΡ€ΠΈΠ±Π°Π²Π»ΡΡ‚ΡŒ ΠΊΡ€Π°ΠΉΠ½Π΅Π΅ ΠΏΡ€Π°Π²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ.
Π‘ΡƒΠ΄Π΅ΠΌ Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Ρ‚ΡŒ Ρƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ числа ΠΈ ΠΏΠ΅Ρ€ΠΈΠΎΠ΄, Π° Π·Π°Ρ‚Π΅ΠΌ создадим Π½ΠΎΠ²Ρ‹ΠΉ массив ΠΈ Π·Π°ΠΏΠΎΠ»Π½ΠΈΠΌ Π΅Π³ΠΎ срСдними значСниями.

Π­Ρ‚ΠΎ простой ΠΏΡ€ΠΈΠΌΠ΅Ρ€. Π‘ΠΎΠ»ΡŒΡˆΠ°Ρ Π΅Π³ΠΎ Ρ‡Π°ΡΡ‚ΡŒ связана со считываниСм Π΄Π°Π½Π½Ρ‹Ρ…, вычислСниС срСднСго всСго Π² дСвяти строчках.

3. Π‘ΠΈΠ½ΠΎΠΌ ΠΡŒΡŽΡ‚ΠΎΠ½Π°. Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Ρ‚Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½ΡƒΡŽ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ ΠΈ Π·Π°ΠΏΠΎΠ»Π½ΠΈΠΌ Π±ΠΈΠ½ΠΎΠΌΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ коэффициСнтами

Если Π’Ρ‹ ΠΆΠ΅Π»Π°Π΅Ρ‚Π΅ ΠΈΠ·ΡƒΡ‡Π°Ρ‚ΡŒ этот ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π» с ΠΏΡ€Π΅ΠΏΠΎΠ΄Π°Π²Π°Ρ‚Π΅Π»Π΅ΠΌ, ΡΠΎΠ²Π΅Ρ‚ΡƒΡŽ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ Ρ€Π΅ΠΏΠ΅Ρ‚ΠΈΡ‚ΠΎΡ€Ρƒ ΠΏΠΎ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΠΊΠ΅

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

ДинамичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти Π² Π‘ΠΈ

ΠžΡ‡Π΅Π½ΡŒ часто Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚ Π·Π°Π΄Π°Ρ‡ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ массивов Π΄Π°Π½Π½Ρ‹Ρ…, Ρ€Π°Π·ΠΌΠ΅Ρ€Π½ΠΎΡΡ‚ΡŒ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π·Π°Ρ€Π°Π½Π΅Π΅ нСизвСстна. Π’ этом случаС Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ использованиС ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· Π΄Π²ΡƒΡ… ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΎΠ²:

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

ΠΠ°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ адрСс статичСского массива опрСдСляСтся компилятором Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π΅Π³ΠΎ объявлСния ΠΈ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½.

Для динамичСского массива Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ адрСс присваиваСтся ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½ΠΎΠΌΡƒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŽ Π½Π° массив Π² процСссС выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ динамичСского выдСлСния памяти

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ динамичСского выдСлСния памяти находят Π² ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти Π½Π΅ΠΏΡ€Π΅Ρ€Ρ‹Π²Π½Ρ‹ΠΉ участок Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ адрСс этого участка.

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ динамичСского распрСдСлСния памяти:

Для использования Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ динамичСского распрСдСлСния памяти Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ :

Для опрСдСлСния Ρ€Π°Π·ΠΌΠ΅Ρ€Π° массива Π² Π±Π°ΠΉΡ‚Π°Ρ…, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ malloc() трСбуСтся количСство элСмСнтов ΡƒΠΌΠ½ΠΎΠΆΠΈΡ‚ΡŒ Π½Π° Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΎΠ΄Π½ΠΎΠ³ΠΎ элСмСнта. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ элСмСнтами массива ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΊΠ°ΠΊ Π΄Π°Π½Π½Ρ‹Π΅ простых Ρ‚ΠΈΠΏΠΎΠ², Ρ‚Π°ΠΊ ΠΈ составных Ρ‚ΠΈΠΏΠΎΠ² (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, структуры), для Ρ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ опрСдСлСния Ρ€Π°Π·ΠΌΠ΅Ρ€Π° элСмСнта Π² ΠΎΠ±Ρ‰Π΅ΠΌ случаС рСкомСндуСтся использованиС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

Β«ΠŸΡ€Π°Π²ΠΈΠ»ΠΎΠΌ Ρ…ΠΎΡ€ΠΎΡˆΠ΅Π³ΠΎ Ρ‚ΠΎΠ½Π°Β» Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ являСтся освобоТдСниС динамичСски Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ памяти Π² случаС отсутствия Π΅Π΅ дальнСйшСго использования. Однако Ссли динамичСски выдСлСнная ΠΏΠ°ΠΌΡΡ‚ΡŒ Π½Π΅ освобоТдаСтся явным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΎΠ½Π° Π±ΡƒΠ΄Π΅Ρ‚ освобоТдСна ΠΏΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

ДинамичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти для ΠΎΠ΄Π½ΠΎΠΌΠ΅Ρ€Π½Ρ‹Ρ… массивов

Π€ΠΎΡ€ΠΌΠ° обращСния ΠΊ элСмСнтам массива с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π²ΠΈΠ΄:

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π½Π° Π‘ΠΈ : ΠžΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΡ динамичСского ΠΎΠ΄Π½ΠΎΠΌΠ΅Ρ€Π½ΠΎΠ³ΠΎ массива ΠΈ Π²Π²ΠΎΠ΄ Π΅Π³ΠΎ элСмСнтов.

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹:
Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти Π² c. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти Π² c. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти Π² c. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти Π² c. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти Π² c

ДинамичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти для Π΄Π²ΡƒΠΌΠ΅Ρ€Π½Ρ‹Ρ… массивов

ΠŸΡƒΡΡ‚ΡŒ трСбуСтся Ρ€Π°Π·ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π² динамичСской памяти ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ, ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‰ΡƒΡŽ n строк ΠΈ m столбцов. ДвумСрная ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°ΡΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒΡΡ Π² ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти Π² Ρ„ΠΎΡ€ΠΌΠ΅ Π»Π΅Π½Ρ‚Ρ‹, состоящСй ΠΈΠ· элСмСнтов строк. ΠŸΡ€ΠΈ этом индСкс любого элСмСнта Π΄Π²ΡƒΠΌΠ΅Ρ€Π½ΠΎΠΉ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΏΠΎ Ρ„ΠΎΡ€ΠΌΡƒΠ»Π΅

index = i*m+j;

Рассмотрим ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ 3×4 (см. рис.)
Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти Π² c. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти Π² c. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти Π² c. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти Π² c. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти Π² c
ИндСкс Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ элСмСнта опрСдСлится ΠΊΠ°ΠΊ

index = 1*4+2=6

ОбъСм памяти, Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹ΠΉ для размСщСния Π΄Π²ΡƒΠΌΠ΅Ρ€Π½ΠΎΠ³ΠΎ массива, опрСдСлится ΠΊΠ°ΠΊ

nΒ·mΒ·(Ρ€Π°Π·ΠΌΠ΅Ρ€ элСмСнта)

Однако ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΡ€ΠΈ Ρ‚Π°ΠΊΠΎΠΌ объявлСнии компилятору явно Π½Π΅ указываСтся количСство элСмСнтов Π² строкС ΠΈ столбцС Π΄Π²ΡƒΠΌΠ΅Ρ€Π½ΠΎΠ³ΠΎ массива, Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½ΠΎΠ΅ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ элСмСнту ΠΏΡƒΡ‚Π΅ΠΌ указания индСкса строки ΠΈ индСкса столбца являСтся Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΌ:

ΠŸΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ элСмСнту с использованиСм указатСля Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΠΊΠ°ΠΊ

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π½Π° Π‘ΠΈ Π’Π²ΠΎΠ΄ ΠΈ Π²Ρ‹Π²ΠΎΠ΄ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ динамичСского Π΄Π²ΡƒΠΌΠ΅Ρ€Π½ΠΎΠ³ΠΎ массива

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния
Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти Π² c. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти Π² c. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти Π² c. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти Π² c. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти Π² c

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти Π² c. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти Π² c. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти Π² c. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти Π² c. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти Π² c

ГрафичСски Ρ‚Π°ΠΊΠΎΠΉ способ выдСлСния памяти ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ.
Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти Π² c. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти Π² c. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти Π² c. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти Π² c. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти Π² c
ΠŸΡ€ΠΈ Ρ‚Π°ΠΊΠΎΠΌ способС выдСлСния памяти компилятору явно ΡƒΠΊΠ°Π·Π°Π½ΠΎ количСство строк ΠΈ количСство столбцов Π² массивС.
ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π½Π° Π‘ΠΈ

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π΅Π½ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌΡƒ ΡΠ»ΡƒΡ‡Π°ΡŽ.

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

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π½Π° Π‘ΠΈ : Π‘Π²ΠΎΠ±ΠΎΠ΄Π½Ρ‹ΠΉ массив

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния
Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти Π² c. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти Π² c. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти Π² c. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти Π² c. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти Π² c

ΠŸΠ΅Ρ€Π΅Ρ€Π°ΡΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти

Если Ρ€Π°Π·ΠΌΠ΅Ρ€ выдСляСмой памяти нСльзя Π·Π°Π΄Π°Ρ‚ΡŒ Π·Π°Ρ€Π°Π½Π΅Π΅, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€ΠΈ Π²Π²ΠΎΠ΄Π΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π΄ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, Ρ‚ΠΎ для увСличСния Ρ€Π°Π·ΠΌΠ΅Ρ€Π° массива ΠΏΡ€ΠΈ Π²Π²ΠΎΠ΄Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ значСния Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ дСйствия:

ВсС пСрСчислСнныС Π²Ρ‹ΡˆΠ΅ дСйствия (ΠΊΡ€ΠΎΠΌΠ΅ послСднСго) выполняСт функция

Π Π°Π·ΠΌΠ΅Ρ€ Π±Π»ΠΎΠΊΠ° памяти, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ссылаСтся ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ptr измСняСтся Π½Π° size Π±Π°ΠΉΡ‚ΠΎΠ². Π‘Π»ΠΎΠΊ памяти ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Ρ‚ΡŒΡΡ ΠΈΠ»ΠΈ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Ρ‚ΡŒΡΡ Π² Ρ€Π°Π·ΠΌΠ΅Ρ€Π΅. Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ΅ Π±Π»ΠΎΠΊΠ° памяти сохраняСтся Π΄Π°ΠΆΠ΅ Ссли Π½ΠΎΠ²Ρ‹ΠΉ Π±Π»ΠΎΠΊ ΠΈΠΌΠ΅Π΅Ρ‚ мСньший Ρ€Π°Π·ΠΌΠ΅Ρ€, Ρ‡Π΅ΠΌ старый. Но ΠΎΡ‚Π±Ρ€Π°ΡΡ‹Π²Π°ΡŽΡ‚ΡΡ Ρ‚Π΅ Π΄Π°Π½Π½Ρ‹Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ выходят Π·Π° Ρ€Π°ΠΌΠΊΠΈ Π½ΠΎΠ²ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ°. Если Π½ΠΎΠ²Ρ‹ΠΉ Π±Π»ΠΎΠΊ памяти большС старого, Ρ‚ΠΎ содСрТимоС вновь Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ памяти Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π½Π° Π‘ΠΈ Π’Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ для Π²Π²ΠΎΠ΄Π° массива Ρ†Π΅Π»Ρ‹Ρ… чисСл. ПослС Π²Π²ΠΎΠ΄Π° ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ значСния Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ вопрос ΠΎ Π²Π²ΠΎΠ΄Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ значСния.

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния
Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти Π² c. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти Π² c. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти Π² c. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти Π² c. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти Π² c

ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π² ΠΊ записи: 84

cout «_asm code started working» endl;

_asm <
pushf // ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅ΠΌ рСгистр Ρ„Π»Π°Π³ΠΎΠ² Π² стСк
pop var // ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅ΠΌ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ ΠΈΠ· стСка (ΡˆΡ‚Π°?)
>

cout «_asm code finished working» endl;

// Π’Ρ‹Π²ΠΎΠ΄ var
cout var endl;

short *var;
var = new short[1];
cout «_asm code started working» endl;

_asm <
pushf // ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅ΠΌ рСгистр Ρ„Π»Π°Π³ΠΎΠ² Π² стСк
pop *var[0] // ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅ΠΌ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ ΠΈΠ· стСка (ΡˆΡ‚Π°?)
>

cout «_asm code finished working» endl;

// Π’Ρ‹Π²ΠΎΠ΄ var
cout *var[0] endl;

#include
#include
#include
#include

#include
#include
#include
#include

#define _CRT_SECURE_NO_WARNINGS
#include «stdlib.h»
#include «stdio.h»
#include «conio.h»
#include «math.h»
#include
#include «locale.h»
#include «string.h»
#include «windows.h»
#include «time.h»

a = ( int **)realloc(a, (2*n*m) * sizeof ( int ));

for (i = n; i // Ρ†ΠΈΠΊΠ» ΠΏΠΎ строкам
<
for (j = 0; j // Ρ†ΠΈΠΊΠ» ΠΏΠΎ столбцам
<
a[i][j] = b[counter][j];
counter++;
>
printf( «\n» );
>

// ΠžΡ‡ΠΈΡΡ‚ΠΊΠ° памяти
for (i = 0; i // Ρ†ΠΈΠΊΠ» ΠΏΠΎ строкам
free(a[i]); // освобоТдСниС памяти ΠΏΠΎΠ΄ строку
free(a);

for (i = 0; i // Ρ†ΠΈΠΊΠ» ΠΏΠΎ строкам
free(b[i]); // освобоТдСниС памяти ΠΏΠΎΠ΄ строку
free(b);

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

ДинамичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти Π² C++

Π‘++ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π½ΠΎΠ²Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с динамичСской ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² new ΠΈ delete :

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ new ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Ρ„ΠΎΡ€ΠΌΠ°Ρ…:

ΠŸΠ°ΠΌΡΡ‚ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ распрСдСлСна для ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΈΠ»ΠΈ для массива любого Ρ‚ΠΈΠΏΠ°, Π² Ρ‚ΠΎΠΌ числС Ρ‚ΠΈΠΏΠ°, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ выполнСния ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ new Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΎΡ‚Π²Π΅Π΄Π΅Π½Π½ΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ, ΠΈΠ»ΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ std::bad_alloc Π² случаС ошибки.

ОсвобоТдСниС памяти связано с Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ Π²Ρ‹Π΄Π΅Π»ΡΠ»Π°ΡΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ – для ΠΎΠ΄Π½ΠΎΠ³ΠΎ элСмСнта ΠΈΠ»ΠΈ для Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ…. Π’ соотвСтствии с этим сущСствуСт ΠΈ Π΄Π²Π΅ Ρ„ΠΎΡ€ΠΌΡ‹ примСнСния delete :

НапримСр, для ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ Π²Ρ‹ΡˆΠ΅ случая, ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния
Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти Π² c. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти Π² c. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти Π² c. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти Π² c. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти Π² c

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π½Π΅ΡƒΠ΄Π°Ρ‡Π½ΠΎΠ³ΠΎ выдСлСния памяти (Π² случаС ΠΎΡ‡Π΅Π½ΡŒ большого Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΠΎΠ³ΠΎ объСма):

ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π² ΠΊ записи: 30

Π’ΠΎΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Π² ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ ΠΌΠΎΠΆΠ½ΠΎ Π³ΠΎΡ€Π°Π·Π΄ΠΎ быстрСС, Ρ‡Π΅ΠΌ Π·Π° n ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠΉ! Для этого Π½ΡƒΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌΠΈ Ρ€Π΅ΠΊΡƒΡ€Ρ€Π΅Π½Ρ‚Π½Ρ‹ΠΌΠΈ ΡΠΎΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡΠΌΠΈ: an = (a2)n/2 ΠΏΡ€ΠΈ Ρ‡Π΅Ρ‚Π½ΠΎΠΌ n, an = a Γ— anβˆ’1 ΠΏΡ€ΠΈ Π½Π΅Ρ‡Π΅Ρ‚Π½ΠΎΠΌ n. Π Π΅Π°Π»ΠΈΠ·ΡƒΠΉΡ‚Π΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ быстрого возвСдСния Π² ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ рСкурсивной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π€ΠΎΡ€ΠΌΠ°Ρ‚ Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… Вводятся Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ число a ΠΈ Ρ†Π΅Π»ΠΎΠ΅ Π½Π΅ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ число n. Π€ΠΎΡ€ΠΌΠ°Ρ‚ Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…

Π”Π°Π½ΠΎ число N. ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅, сколькими способами ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°ΡΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π½Π° доскС NΓ—N N Ρ„Π΅Ρ€Π·Π΅ΠΉ, Π½Π΅ Π±ΡŒΡŽΡ‰ΠΈΡ… Π΄Ρ€ΡƒΠ³ Π΄Ρ€ΡƒΠ³Π°.

#include
#include
char *resize( const char *str, unsigned size, unsigned new_size);
char *getline();
using namespace std;

#include
#include
#define ESC 27
#define EOS ‘\n’
using namespace std;

typedef struct <
float **matrix;
unsigned int volume;
char name;
>matrix;

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

ДинамичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти Π² языкС C++

Как Π²Ρ‹ ΡƒΠΆΠ΅ Π·Π½Π°Π΅Ρ‚Π΅, ΠΏΡ€ΠΈ объявлСнии ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ…, Π° для массива Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π·Π°Π΄Π°Ρ‚ΡŒ Ρ‚ΠΎΡ‡Π½ΠΎΠ΅ количСство элСмСнтов. На основС этой ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΏΡ€ΠΈ запускС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ автоматичСски выдСляСтся Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΉ объСм памяти. ПослС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΏΠ°ΠΌΡΡ‚ΡŒ автоматичСски освобоТдаСтся. Π˜Π½Ρ‹ΠΌΠΈ словами, объСм памяти Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π½Π°Ρ‚ΡŒ Π΄ΠΎ выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π’ΠΎ врСмя выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΠΈΠ»ΠΈ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ массива нСльзя.

Π’Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти ΠΏΠΎΠ΄ ΠΎΠ΄ΠΈΠ½ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚

Для выдСлСния памяти ΠΏΠΎΠ΄ ΠΎΠ΄ΠΈΠ½ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ синтаксис:

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

ПослС использования ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° delete ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΏΡ€Π΅ΠΆΠ½ΠΈΠΉ адрСс. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ послС использования ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° delete ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ принято ΠΎΠ±Π½ΡƒΠ»ΡΡ‚ΡŒ. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ выдСлСния памяти ΠΏΠΎΠ΄ ΠΎΠ΄ΠΈΠ½ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π² листингС 3.14.

Листинг 3.14. ДинамичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти ΠΏΠΎΠ΄ ΠΎΠ΄ΠΈΠ½ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚

Π’Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти ΠΏΠΎΠ΄ массив

Π’Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти ΠΏΠΎΠ΄ массив производится ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

ΠžΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π°ΠΊ:

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ освобоТдСнии памяти количСство элСмСнтов Π½Π΅ указываСтся. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ выдСлСния памяти ΠΏΠΎΠ΄ массив ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π² листингС 3.15.

Листинг 3.15. ДинамичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти ΠΏΠΎΠ΄ массив

Π’Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти Π±Π΅Π· возбуТдСния ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ

Листинг 3.16. ДинамичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти Π±Π΅Π· возбуТдСния ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ

ДинамичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти Π² языкС C

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ malloc() ΠΈ free()

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ выдСлСния памяти для ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π² листингС 3.17.

Листинг 3.17. ДинамичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти для ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ выдСлСния памяти ΠΏΠΎΠ΄ массив ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π² листингС 3.18.

Листинг 3.18. ДинамичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти ΠΏΠΎΠ΄ массив

Ѐункция calloc()

ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ‚Π°ΠΊ:

Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° использования Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ calloc() создадим Π΄Π²ΡƒΠΌΠ΅Ρ€Π½Ρ‹ΠΉ массив (листинг 3.19). Для этого Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ массив ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΈ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ элСмСнтС массива ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ адрСс строки. ΠŸΠ°ΠΌΡΡ‚ΡŒ для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ строки Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ.

Листинг 3.19. ДинамичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти ΠΏΠΎΠ΄ Π΄Π²ΡƒΠΌΠ΅Ρ€Π½Ρ‹ΠΉ массив

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: ΠΏΡ€ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ памяти Π²Π½Π°Ρ‡Π°Π»Π΅ освобоТдаСтся ΠΏΠ°ΠΌΡΡ‚ΡŒ, выдСлСнная Ρ€Π°Π½Π΅Π΅ ΠΏΠΎΠ΄ строки, Π° лишь Π·Π°Ρ‚Π΅ΠΌ освобоТдаСтся ΠΏΠ°ΠΌΡΡ‚ΡŒ, выдСлСнная Ρ€Π°Π½Π΅Π΅ ΠΏΠΎΠ΄ массив ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ.

Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΌΡ‹ сохраняСм Π² массивС ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ лишь адрСс строки, Π° Π½Π΅ саму строку, количСство элСмСнтов Π² строкС ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΌ. Π­Ρ‚ΠΎ ΠΎΠ±ΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΡΡ‚Π²ΠΎ позволяСт ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Π΅ Β«Π·ΡƒΠ±Ρ‡Π°Ρ‚Ρ‹Π΅Β» Π΄Π²ΡƒΠΌΠ΅Ρ€Π½Ρ‹Π΅ массивы.

Π‘Ρ‚Ρ€ΠΎΠΊΠΈ Π² памяти ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ располоТСны Π² Ρ€Π°Π·Π½Ρ‹Ρ… мСстах, Ρ‡Ρ‚ΠΎ Π½Π΅ позволяСт эффСктивно ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ доступ ΠΊ элСмСнтам Π΄Π²ΡƒΠΌΠ΅Ρ€Π½ΠΎΠ³ΠΎ массива. Π§Ρ‚ΠΎΠ±Ρ‹ доступ ΠΊ элСмСнтам ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ максимально быстрым, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π΄Π²ΡƒΠΌΠ΅Ρ€Π½Ρ‹ΠΉ массив Π² Π²ΠΈΠ΄Π΅ ΠΎΠ΄Π½ΠΎΠΌΠ΅Ρ€Π½ΠΎΠ³ΠΎ массива (листинг 3.20).

Листинг 3.20. ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½ΠΈΠ΅ Π΄Π²ΡƒΠΌΠ΅Ρ€Π½ΠΎΠ³ΠΎ массива Π² Π²ΠΈΠ΄Π΅ ΠΎΠ΄Π½ΠΎΠΌΠ΅Ρ€Π½ΠΎΠ³ΠΎ

Π’Π°ΠΊ ΠΊΠ°ΠΊ Π² этом случаС всС элСмСнты Π΄Π²ΡƒΠΌΠ΅Ρ€Π½ΠΎΠ³ΠΎ массива располоТСны Π² смСТных ячСйках, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ элСмСнтам с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ указатСля ΠΈ адрСсной Π°Ρ€ΠΈΡ„ΠΌΠ΅Ρ‚ΠΈΠΊΠΈ. НапримСр, ΠΏΡ€ΠΎΠ½ΡƒΠΌΠ΅Ρ€ΡƒΠ΅ΠΌ всС элСмСнты:

Ѐункция realloc()

Ѐункция realloc() выполняСт пСрСраспрСдСлСниС памяти. ΠŸΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ realloc() ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π² листингС 3.21.

Листинг 3.21. Ѐункция realloc()

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти Π² c. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти Π² c. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти Π² c. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти Π² c. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти Π² c
Π£Ρ‡Π΅Π±Π½ΠΈΠΊ C++ (Qt Creator ΠΈ MinGW) Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ PDF

ΠŸΠΎΠΌΠΎΡ‰ΡŒ сайту

ПАО Π‘Π±Π΅Ρ€Π±Π°Π½ΠΊ:
Π‘Ρ‡Π΅Ρ‚: 40817810855006152256
Π Π΅ΠΊΠ²ΠΈΠ·ΠΈΡ‚Ρ‹ Π±Π°Π½ΠΊΠ°:
НаимСнованиС: Π‘Π•Π’Π•Π Πž-Π—ΠΠŸΠΠ”ΠΠ«Π™ Π‘ΠΠΠš ПАО Π‘Π‘Π•Π Π‘ΠΠΠš
ΠšΠΎΡ€Ρ€Π΅ΡΠΏΠΎΠ½Π΄Π΅Π½Ρ‚ΡΠΊΠΈΠΉ счСт: 30101810500000000653
Π‘Π˜Πš: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНΠ₯: 96130
Π‘ΠΊΡ€ΠΈΠ½ΡˆΠΎΡ‚ Ρ€Π΅ΠΊΠ²ΠΈΠ·ΠΈΡ‚ΠΎΠ²

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Π£Ρ€ΠΎΠΊ β„–85. ДинамичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти

Обновл. 13 БСн 2021 |

Π―Π·Ρ‹ΠΊ Π‘++ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ‚Ρ€ΠΈ основных Ρ‚ΠΈΠΏΠ° выдСлСния (ΠΈΠ»ΠΈ «распрСдСлСния») памяти, с двумя ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ…, ΠΌΡ‹ ΡƒΠΆΠ΅ Π·Π½Π°ΠΊΠΎΠΌΡ‹:

БтатичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти выполняСтся для статичСских ΠΈ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…. ΠŸΠ°ΠΌΡΡ‚ΡŒ выдСляСтся ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· (ΠΏΡ€ΠΈ запускС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹) ΠΈ сохраняСтся Π½Π° протяТСнии Ρ€Π°Π±ΠΎΡ‚Ρ‹ всСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

АвтоматичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти выполняСтся для ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…. ΠŸΠ°ΠΌΡΡ‚ΡŒ выдСляСтся ΠΏΡ€ΠΈ Π²Ρ…ΠΎΠ΄Π΅ Π² Π±Π»ΠΎΠΊ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ находятся эти ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, ΠΈ удаляСтся ΠΏΡ€ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π΅ ΠΈΠ· Π½Π΅Π³ΠΎ.

ДинамичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти являСтся Ρ‚Π΅ΠΌΠΎΠΉ этого ΡƒΡ€ΠΎΠΊΠ°.

ДинамичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…

Как статичСскоС, Ρ‚Π°ΠΊ ΠΈ автоматичСскоС распрСдСлСниС памяти ΠΈΠΌΠ΅ΡŽΡ‚ Π΄Π²Π° ΠΎΠ±Ρ‰ΠΈΡ… свойства:

Π Π°Π·ΠΌΠ΅Ρ€ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ/массива Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ извСстСн Π²ΠΎ врСмя компиляции.

Π’Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΈ освобоТдСниС памяти происходит автоматичСски (ΠΊΠΎΠ³Π΄Π° пСрСмСнная создаСтся/уничтоТаСтся).

Π’ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв с этим всё ОК. Однако, ΠΊΠΎΠ³Π΄Π° Π΄Π΅Π»ΠΎ Π΄ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ Π΄ΠΎ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΌ Π²Π²ΠΎΠ΄ΠΎΠΌ, Ρ‚ΠΎ эти ограничСния ΠΌΠΎΠ³ΡƒΡ‚ привСсти ΠΊ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°ΠΌ.

Если Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ всСх ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π²ΠΎ врСмя компиляции, Ρ‚ΠΎ самоС Π»ΡƒΡ‡ΡˆΠ΅Π΅, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ β€” это ΠΏΠΎΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ ΡƒΠ³Π°Π΄Π°Ρ‚ΡŒ ΠΈΡ… ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€, надСясь, Ρ‡Ρ‚ΠΎ этого Π±ΡƒΠ΄Π΅Ρ‚ достаточно:

Π­Ρ‚ΠΎ ΠΏΠ»ΠΎΡ…ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅, ΠΏΠΎ Ρ‚Ρ€Π΅ΠΌ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ:

Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, тСряСтся ΠΏΠ°ΠΌΡΡ‚ΡŒ, Ссли ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ фактичСски Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ, Π½ΠΎ Π½Π΅ всС. НапримСр, Ссли ΠΌΡ‹ Π²Ρ‹Π΄Π΅Π»ΠΈΠΌ 30 символов для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ, Π½ΠΎ ΠΈΠΌΠ΅Π½Π° Π² срСднСм Π±ΡƒΠ΄ΡƒΡ‚ Π·Π°Π½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΏΠΎ 15 символов, Ρ‚ΠΎ ΠΏΠΎΡ‚Ρ€Π΅Π±Π»Π΅Π½ΠΈΠ΅ памяти получится Π² Π΄Π²Π° Ρ€Π°Π·Π° большС, Ρ‡Π΅ΠΌ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π½Π° самом Π΄Π΅Π»Π΅. Или рассмотрим массив rendering : Ссли ΠΎΠ½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ 20 000 ΠΏΠΎΠ»ΠΈΠ³ΠΎΠ½ΠΎΠ², Ρ‚ΠΎ ΠΏΠ°ΠΌΡΡ‚ΡŒ для Π΄Ρ€ΡƒΠ³ΠΈΡ… 20 000 ΠΏΠΎΠ»ΠΈΠ³ΠΎΠ½ΠΎΠ² фактичСски тратится Π²ΠΏΡƒΡΡ‚ΡƒΡŽ (Ρ‚.Π΅. Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ)!

Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, ΠΏΠ°ΠΌΡΡ‚ΡŒ для Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… (Π²ΠΊΠ»ΡŽΡ‡Π°Ρ фиксированныС массивы) выдСляСтся ΠΈΠ· ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ€Π΅Π·Π΅Ρ€Π²ΡƒΠ°Ρ€Π° памяти β€” стСка. ОбъСм памяти стСка Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Π½Π΅Π²Π΅Π»ΠΈΠΊ: Π² Visual Studio ΠΎΠ½ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Ρ€Π°Π²Π΅Π½ 1ΠœΠ‘. Если Π²Ρ‹ прСвыситС это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ стСка, ΠΈ опСрационная систСма автоматичСски Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ вашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

Π’ Visual Studio это ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, запустив ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠ΄Π°:

Π›ΠΈΠΌΠΈΡ‚ Π² 1ΠœΠ‘ памяти ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°Ρ‚ΠΈΡ‡Π½Ρ‹ΠΌ для ΠΌΠ½ΠΎΠ³ΠΈΡ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, особСнно Π³Π΄Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π³Ρ€Π°Ρ„ΠΈΠΊΠ°.

Π’-Ρ‚Ρ€Π΅Ρ‚ΡŒΠΈΡ…, ΠΈ самоС Π³Π»Π°Π²Π½ΠΎΠ΅, это ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ искусствСнным ограничСниям ΠΈ/ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡŽ массива. Π§Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚, Ссли ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ попытаСтся ΠΏΡ€ΠΎΡ‡Π΅ΡΡ‚ΡŒ 500 записСй с диска, Π½ΠΎ ΠΌΡ‹ Π²Ρ‹Π΄Π΅Π»ΠΈΠ»ΠΈ ΠΏΠ°ΠΌΡΡ‚ΡŒ максимум для 400? Π›ΠΈΠ±ΠΎ ΠΌΡ‹ Π²Ρ‹Π²Π΅Π΄Π΅ΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ ΠΎΡˆΠΈΠ±ΠΊΡƒ, Ρ‡Ρ‚ΠΎ максимальноС количСство записСй β€” 400, Π»ΠΈΠ±ΠΎ (Π² Ρ…ΡƒΠ΄ΡˆΠ΅ΠΌ случаС) выполнится ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ массива ΠΈ Π·Π°Ρ‚Π΅ΠΌ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΎΡ‡Π΅Π½ΡŒ Π½Π΅Ρ…ΠΎΡ€ΠΎΡˆΠ΅Π΅.

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

Для динамичСского выдСлСния памяти ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ new:

Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅, ΠΌΡ‹ Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅ΠΌ Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти для цСлочислСнной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈΠ· ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы. ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ new Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ, содСрТащий адрСс Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ памяти.

Для доступа ΠΊ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ памяти создаСтся ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ:

Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Ρ€Π°Π·Ρ‹ΠΌΠ΅Π½ΠΎΠ²Π°Ρ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ для получСния значСния:

Π’ΠΎΡ‚ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· случаСв, ΠΊΠΎΠ³Π΄Π° ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹. Π‘Π΅Π· указатСля с адрСсом Π½Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ Ρƒ нас Π½Π΅ Π±Ρ‹Π»ΠΎ Π±Ρ‹ способа ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ Π½Π΅ΠΉ.

Как Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ динамичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти?

На вашСм ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅ имССтся ΠΏΠ°ΠΌΡΡ‚ΡŒ (Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, большая Π΅Ρ‘ Ρ‡Π°ΡΡ‚ΡŒ), которая доступна для использования ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°ΠΌΠΈ. ΠŸΡ€ΠΈ запускС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ваша опСрационная систСма Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ эту ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ этой памяти. И эта ΠΏΠ°ΠΌΡΡ‚ΡŒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠ°Ρ вашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ, Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Π° Π½Π° нСсколько частСй, каТдая ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… выполняСт ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΡƒΡŽ Π·Π°Π΄Π°Ρ‡Ρƒ. Одна Ρ‡Π°ΡΡ‚ΡŒ содСрТит ваш ΠΊΠΎΠ΄, другая ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ (отслСТиваниС Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, созданиС ΠΈ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΈ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈ Ρ‚.Π΄.). ΠœΡ‹ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ΠΎΠ± этом Ρ‡ΡƒΡ‚ΡŒ ΠΏΠΎΠ·ΠΆΠ΅. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, большая Ρ‡Π°ΡΡ‚ΡŒ доступной памяти ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π° просто находится Π² ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΈ запросов Π½Π° Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΎΡ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ.

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

Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ статичСского ΠΈΠ»ΠΈ автоматичСского выдСлСния памяти, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° запрос ΠΈ ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ динамичСски Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ памяти.

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

Когда Π²Ρ‹ динамичСски выдСляСтС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ, Ρ‚ΠΎ Π²Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΅Ρ‘ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ посрСдством прямой ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈΠ»ΠΈ uniform-ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ (Π² Π‘++11):

Когда ΡƒΠΆΠ΅ всё, Ρ‡Ρ‚ΠΎ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»ΠΎΡΡŒ, Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΎ с динамичСски Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ β€” Π½ΡƒΠΆΠ½ΠΎ явно ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ для Π‘++ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ эту ΠΏΠ°ΠΌΡΡ‚ΡŒ. Для ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… это выполняСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° delete:

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ delete Π½Π° самом Π΄Π΅Π»Π΅ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ удаляСт. Он просто Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΏΠ°ΠΌΡΡ‚ΡŒ, которая Π±Ρ‹Π»Π° Π²Ρ‹Π΄Π΅Π»Π΅Π½Π° Ρ€Π°Π½Π΅Π΅, ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π² ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΡƒΡŽ систСму. Π—Π°Ρ‚Π΅ΠΌ опСрационная систСма ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π½Π°Π·Π½Π°Ρ‡ΠΈΡ‚ΡŒ эту ΠΏΠ°ΠΌΡΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ (ΠΈΠ»ΠΈ этому ΠΆΠ΅ снова).

Π₯отя ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ удаляСм ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ, Π½ΠΎ это Π½Π΅ Ρ‚Π°ΠΊ! ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ-ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚Ρƒ ΠΆΠ΅ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости, Ρ‡Ρ‚ΠΎ ΠΈ Ρ€Π°Π½ΡŒΡˆΠ΅, ΠΈ Π΅ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ Π½ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΊΠ°ΠΊ ΠΈ любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ указатСля, Π½Π΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎ Π½Π° динамичСски Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ, ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°ΠΌ.

ВисячиС ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ

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

Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ Π½Π° ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π΅Π½Π½ΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ, называСтся висячим ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ. Π Π°Π·Ρ‹ΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠ»ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ висячСго указатСля ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½Ρ‹ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌ. Рассмотрим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ:

ΠŸΡ€ΠΎΡ†Π΅ΡΡ освобоТдСния памяти ΠΌΠΎΠΆΠ΅Ρ‚ Ρ‚Π°ΠΊΠΆΠ΅ привСсти ΠΈ ΠΊ созданию Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… висячих ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ. Рассмотрим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

Π•ΡΡ‚ΡŒ нСсколько Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ здСсь ΠΏΠΎΠΌΠΎΡ‡ΡŒ:

Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, ΡΡ‚Π°Ρ€Π°ΠΉΡ‚Π΅ΡΡŒ ΠΈΠ·Π±Π΅Π³Π°Ρ‚ΡŒ ситуаций, ΠΊΠΎΠ³Π΄Π° нСсколько ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ Π½Π° ΠΎΠ΄Π½Ρƒ ΠΈ Ρ‚Ρƒ ΠΆΠ΅ Ρ‡Π°ΡΡ‚ΡŒ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ памяти. Если это Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ρ‚ΠΎ выяснитС, ΠΊΠ°ΠΊΠΎΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ΠΈΠ· всСх Β«Π²Π»Π°Π΄Π΅Π΅Ρ‚Β» ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ (ΠΈ ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° Π΅Ρ‘ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅), Π° ΠΊΠ°ΠΊΠΈΠ΅ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ просто ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ доступ ΠΊ Π½Π΅ΠΉ.

Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ удаляСтС ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ, ΠΈ, Ссли ΠΎΠ½ Π½Π΅ Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΈΠ· области видимости сразу ΠΆΠ΅ послС удалСния, Ρ‚ΠΎ Π΅Π³ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌ, Ρ‚.Π΅. ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 0 (ΠΈΠ»ΠΈ nullptr Π² Π‘++11). Под Β«Π²Ρ‹Ρ…ΠΎΠ΄ΠΎΠΌ ΠΈΠ· области видимости сразу ΠΆΠ΅ послС удалСния» имССтся Π² Π²ΠΈΠ΄Ρƒ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ удаляСтС ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π² самом ΠΊΠΎΠ½Ρ†Π΅ Π±Π»ΠΎΠΊΠ°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½ объявлСн.

ΠŸΡ€Π°Π²ΠΈΠ»ΠΎ: ΠŸΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°ΠΉΡ‚Π΅ ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹ΠΌ указатСлям Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 0 (ΠΈΠ»ΠΈ nullptr Π² C++11), Ссли ΠΎΠ½ΠΈ Π½Π΅ выходят ΠΈΠ· области видимости сразу ΠΆΠ΅ послС удалСния.

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ new

ΠŸΡ€ΠΈ запросС памяти ΠΈΠ· ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы Π² Ρ€Π΅Π΄ΠΊΠΈΡ… случаях ΠΎΠ½Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π° (Ρ‚.Π΅. Π΅Ρ‘ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈ Π½Π΅ Π±Ρ‹Ρ‚ΡŒ Π² Π½Π°Π»ΠΈΡ‡ΠΈΠΈ).

Π’ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… случаях процСсс Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ new (ΠΊΠ°ΠΊ ΠΈ сбой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹) Π½Π΅ΠΆΠ΅Π»Π°Ρ‚Π΅Π»Π΅Π½, поэтому Π΅ΡΡ‚ΡŒ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Π°Ρ Ρ„ΠΎΡ€ΠΌΠ° ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° new, которая Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½ΡƒΠ»Π΅Π²ΠΎΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ, Ссли ΠΏΠ°ΠΌΡΡ‚ΡŒ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π°. НуТно просто Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ константу std::nothrow ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹ΠΌ словом new ΠΈ Ρ‚ΠΈΠΏΠΎΠΌ Π΄Π°Π½Π½Ρ‹Ρ…:

Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅, Ссли ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ new Π½Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ с динамичСски Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ, Ρ‚ΠΎ возвратится Π½ΡƒΠ»Π΅Π²ΠΎΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ.

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

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π½Π΅ Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ new происходит ΠΊΡ€Π°ΠΉΠ½Π΅ Ρ€Π΅Π΄ΠΊΠΎ, Ρ‚ΠΎ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ программисты Π·Π°Π±Ρ‹Π²Π°ΡŽΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ эту ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ!

НулСвыС ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ ΠΈ динамичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти

НулСвыС ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ (ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ 0 ΠΈΠ»ΠΈ nullptr ) особСнно ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ Π² процСссС динамичСского выдСлСния памяти. Π˜Ρ… Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ ΠΊΠ°ΠΊ Π±Ρ‹ сообщаСм Π½Π°ΠΌ: Β«Π­Ρ‚ΠΎΠΌΡƒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŽ Π½Π΅ Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΎ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ памяти». А это, Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для выполнСния условного выдСлСния памяти:

Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ Π½ΡƒΠ»Π΅Π²ΠΎΠ³ΠΎ указатСля Π½ΠΈ Π½Π° Ρ‡Ρ‚ΠΎ Π½Π΅ влияСт. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Π½Π΅Ρ‚ нСобходимости:

ВмСсто этого Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ просто Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ:

Если ptr Π½Π΅ являСтся Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌ, Ρ‚ΠΎ динамичСски выдСлСнная пСрСмСнная Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ΄Π°Π»Π΅Π½Π°. Если Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ указатСля являСтся Π½ΡƒΠ»ΡŒ, Ρ‚ΠΎ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚.

Π£Ρ‚Π΅Ρ‡ΠΊΠ° памяти

ДинамичСски выдСлСнная ΠΏΠ°ΠΌΡΡ‚ΡŒ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ области видимости, Ρ‚.Π΅. ΠΎΠ½Π° остаСтся Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ явно освобоТдСна ΠΈΠ»ΠΈ ΠΏΠΎΠΊΠ° ваша ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π΅ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ своС Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ (ΠΈ опСрационная систСма очистит всС Π±ΡƒΡ„Π΅Ρ€Π° памяти ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ). Однако ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ для хранСния динамичСски Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… адрСсов памяти, ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ области видимости ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…. Π­Ρ‚ΠΎ нСсоотвСтствиС ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ интСрСсноС ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ динамичСски выдСляСм Ρ†Π΅Π»ΠΎΡ‡ΠΈΡΠ»Π΅Π½Π½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ, Π½ΠΎ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ освобоТдаСм ΠΏΠ°ΠΌΡΡ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· использованиС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° delete. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ всСм Ρ‚Π΅ΠΌ ΠΆΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ, Ρ‡Ρ‚ΠΎ ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, Ρ‚ΠΎ, ΠΊΠΎΠ³Π΄Π° функция Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ своС Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅, ptr Π²Ρ‹ΠΉΠ΄Π΅Ρ‚ ΠΈΠ· области видимости. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ptr β€” это СдинствСнная пСрСмСнная, хранящая адрСс динамичСски Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ цСлочислСнной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, Ρ‚ΠΎ, ΠΊΠΎΠ³Π΄Π° ptr уничтоТится, большС Π½Π΅ останСтся ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π° динамичСски Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° «потСряСт» адрСс динамичСски Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ памяти. И Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ эту динамичСски Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΡƒΡŽ Ρ†Π΅Π»ΠΎΡ‡ΠΈΡΠ»Π΅Π½Π½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ нСльзя Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ.

Π­Ρ‚ΠΎ называСтся ΡƒΡ‚Π΅Ρ‡ΠΊΠΎΠΉ памяти. Π£Ρ‚Π΅Ρ‡ΠΊΠ° памяти происходит, ΠΊΠΎΠ³Π΄Π° ваша ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° тСряСт адрСс Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ динамичСски Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ части памяти (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈΠ»ΠΈ массива), ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Π΅Ρ‘ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π² ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΡƒΡŽ систСму. Когда это происходит, Ρ‚ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΡƒΠΆΠ΅ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ эту динамичСски Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ большС Π½Π΅ Π·Π½Π°Π΅Ρ‚, Π³Π΄Π΅ выдСлСнная ΠΏΠ°ΠΌΡΡ‚ΡŒ находится. ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Π°Ρ систСма Ρ‚Π°ΠΊΠΆΠ΅ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ эту ΠΏΠ°ΠΌΡΡ‚ΡŒ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ считаСтся, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ вашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ.

Π£Ρ‚Π΅Ρ‡ΠΊΠΈ памяти Β«ΡΡŠΠ΅Π΄Π°ΡŽΡ‚Β» ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ Π²ΠΎ врСмя выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Ρ количСство доступной памяти Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для этой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π½ΠΎ ΠΈ для Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ Ρ‚Π°ΠΊΠΆΠ΅. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ с ΡΠ΅Ρ€ΡŒΠ΅Π·Π½Ρ‹ΠΌΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°ΠΌΠΈ с ΡƒΡ‚Π΅Ρ‡ΠΊΠΎΠΉ памяти ΠΌΠΎΠ³ΡƒΡ‚ Β«ΡΡŠΠ΅ΡΡ‚ΡŒΒ» всю Π΄ΠΎΡΡ‚ΡƒΠΏΠ½ΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ, Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Ρ‡Π΅Π³ΠΎ ваш ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ Π±ΡƒΠ΄Π΅Ρ‚ ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚ сбой. Волько послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ вашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ, опСрационная систСма смоТСт ΠΎΡ‡ΠΈΡΡ‚ΠΈΡ‚ΡŒ ΠΈ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ всю ΠΏΠ°ΠΌΡΡ‚ΡŒ, которая Β«ΡƒΡ‚Π΅ΠΊΠ»Π°Β».

Π₯отя ΡƒΡ‚Π΅Ρ‡ΠΊΠ° памяти ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ ΠΈ ΠΈΠ·-Π·Π° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΈΠ· области видимости, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ способы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ привСсти ΠΊ ΡƒΡ‚Π΅Ρ‡ΠΊΠ°ΠΌ памяти. НапримСр, Ссли ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŽ, хранящСму адрСс динамичСски Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ памяти, ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅:

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π’Π°Ρˆ адрСс email Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ поля ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ *