1

Тема: Память

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

2

Re: Память

Украй спрощено.
Коли програма запускається, для неї виділяється пам'ять, тобто операційна система позначає десь у себе певний діапазон адрес пам'яті як пам'ять цієї програми. Для частини цієї пам'яті вже від імені програми стандартна бібліотека C створює спеціальну структуру, що зветься купою. Купа оптимізована під швидке виділення та звільнення пам'яті, а також додавання (якщо програма просить виділити більше місця, ніж є в купі, то буде запитана додаткова пам'ять в ОС, і цим також займається купа).
Виклики malloc і calloc позначають в купі певну пам'ять як зайняту і повертають покажчик на неї; виклик free позначає цю пам'ять як звільнену. Якщо ви не розраховуєте, що ваша програма одразу завершить роботу, то завжди маєте стежити, щоб для кожного виклику malloc/calloc був також виклик free, інакше пам'ять буде "текти" (виділятися і не звільнятися, поки в системи не закінчиться вільна пам'ять і програму не буде зупинено примусово).
Перевага пам'яті в купі в тому, що купа одна для всієї програми. Локальні (стекові) змінні звільняють пам'ять при виході з функції, і ця пам'ять може бути використана іншими змінними; пам'ять у купі можна виділити в одній функції, повернути до функції, що її викликала, і передати до третьої. Стандартна бібліотека відстежить, щоб ця пам'ять не виділялася для інших об'єктів, поки її не звільнять.
Також звертаю увагу на функцію realloc, яка за можливості змінює розмір виділеної пам'яті на місці, або, якщо це неможливо чи недоцільно, копіює пам'ять в інше місце.

Утім, в C++ ці виклики замінені на оператор new (звільнення пам'яті - delete). Принципові відмінності: по-перше, new повертає покажчик на об'єкт певного типу, а malloc/calloc - лише на шматок пам'яті певного розміру, це одразу убезпечує від ряду помилок; по-друге, оператор new після виділення пам'яті викликає конструктор об'єкта, тобто ви можете не турбуватися, що в пам'яті об'єкта буде сміття (звісно, якщо ви написали відповідний конструктор); і по-третє, оператор new може бути перевантажено для роботи з іншими алокаторами пам'яті, тому дуже не варто змішувати malloc/free з new/delete.

Подякували: leofun01, FakiNyan, Vo_Vik, Chemist-i, maksym31235