Що таке купа пам'яті?


Відповіді:


234

Імовірно, ви маєте на увазі купу з точки зору розподілу пам'яті, а не з точки зору структури даних (термін має багато значень).

Дуже просте пояснення полягає в тому, що купа - це частина пам'яті, де знаходиться динамічно розподілена пам'ять (тобто пам'ять, виділена через malloc). Пам'ять, виділена з купи, залишатиметься виділеною, поки не відбудеться одне з наступних дій:

  1. Пам'ять free'd
  2. Програма припиняється

Якщо всі посилання на виділену пам'ять втрачені (наприклад, ви більше не зберігаєте вказівник на неї), у вас є те, що називається витоком пам'яті . Тут пам’ять все ще виділяється, але ви вже не маєте простого доступу до неї. Витік пам'яті не може бути повернутий для майбутніх виділень пам'яті, але коли програма закінчиться, операційна система буде звільнена.

Протиставляйте це пам'яті стека, в якій живуть локальні змінні (ті, які визначені в методі). Пам'ять, виділена на стек, зазвичай працює лише до повернення функції (є деякі винятки з цього, наприклад, статичні локальні змінні).

Ви можете знайти більше інформації про купу в цій статті .


3
Як локальні змінні могли жити в стеці? Стек дозволяє лише одночасно приймати одну змінну в дуже конкретному порядку. Що робити, якщо мені потрібна локальна змінна десь нижче в стеці?
CodyBugstein

9
@Imray - статично набраною мовою розміри локальних параметрів відомі під час компіляції. Тому до локальних змінних можна легко отримати доступ безпосередньо зі стека через зміщення адреси. Для цього не потрібно вискакувати стек. Дивіться цю відповідь для отримання більш детальної інформації.
LeopardSkinPillBoxHat

17

Купа пам’яті - це місце в пам'яті, де пам'ять може бути розподілена при випадковому доступі.
На відміну від стека, де пам'ять розподіляється і вивільняється у дуже визначеному порядку, окремі елементи даних, виділені на купі, зазвичай вивільняються способами, асинхронними один від одного. Будь-який такий елемент даних звільняється, коли програма явно випускає відповідний вказівник, і це може призвести до роздробленої купи. У протиставленні можуть випускатися лише дані вгорі (або внизу, залежно від способу роботи стека), в результаті чого елемент даних звільняється у зворотному порядку, в якому вони були розподілені.


9

Купа - це просто область, де пам'ять розподіляється або розміщується без будь-якого замовлення. Це відбувається, коли людина створює об'єкт за допомогою newоператора чи чогось подібного. Це протилежне стеку, де пам'ять розміщується на основі першого та останнього.


8

Купа пам'яті - це загальна структура для зберігання динамічно розподіленої пам'яті. Дивіться Dynamic_memory_allocation у Вікіпедії.

Є й інші споруди, як басейни, штабелі та палі.


7

Це шматок пам'яті, виділений з операційної системи менеджером пам'яті, який використовується процесом. Зателефонувавши до malloc()іншого, тоді забирайте пам'ять з цієї купи замість того, щоб мати справу з операційною системою безпосередньо.


7

Ви, мабуть, маєте на увазі купу пам'яті, а не купу пам'яті.

Пам'ять купи - це, по суті, великий пул пам'яті (як правило, на процес), з якого запущена програма може запитувати шматки. Зазвичай це називається динамічним розподілом .

Він відрізняється від стека, де виділяються "автоматичні змінні". Так, наприклад, коли ви визначаєте в функції C змінну вказівника, на стеку виділяється достатньо місця для зберігання адреси пам'яті. Однак вам часто потрібно буде динамічно виділяти простір (З malloc) на купі, а потім надати адресу, звідки цей фрагмент пам'яті починається до вказівника.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.