Це було щось, що хвилює мене вже віками.
У нас усіх навчають у школі (принаймні, я був), що Ви ОБОВ'ЯЗКОВО звільняєте кожен покажчик, який виділяється. Мені дещо цікаво, що стосується реальної вартості не звільнення пам'яті. У деяких очевидних випадках, наприклад, коли malloc
викликається всередині циклу або частина виконання потоку, дуже важливо звільнити, щоб не було витоків пам'яті. Але розглянемо наступні два приклади:
По-перше, якщо у мене є код, це приблизно так:
int main()
{
char *a = malloc(1024);
/* Do some arbitrary stuff with 'a' (no alloc functions) */
return 0;
}
Який тут реальний результат? Думаю, що процес гине, і тоді купі місця пропаде все-таки, тому немає жодної шкоди для пропуску дзвінка free
(однак, я визнаю важливість того, щоб це все одно було для закриття, ремонту та належної практики). Я правий у такому мисленні?
По-друге, скажімо, у мене є програма, яка трохи схожа на оболонку. Користувачі можуть оголошувати такі змінні, aaa = 123
які зберігаються в деякій динамічній структурі даних для подальшого використання. Зрозуміло, очевидно, що ви використовуєте якесь рішення, яке викликатиме якусь функцію * alloc (хешмап, пов'язаний список, щось подібне). Для цього типу програми не має сенсу ніколи не звільнятися після виклику, malloc
оскільки ці змінні повинні бути присутніми весь час під час виконання програми, і немає хорошого способу (що я бачу) реалізувати це зі статично виділеним простором. Чи погано дизайн мати купу пам’яті, яка виділяється, але звільняється лише в процесі завершення процесу? Якщо так, то яка альтернатива?
free(a)
насправді нічого не робить насправді вільної пам'яті! Він просто скидає деякі покажчики при здійсненні libc malloc, які відслідковують наявні шматки пам’яті на великій сторінці з пам'яттю mmapped (зазвичай її називають «купою»). Ця сторінка все ще буде звільнена лише тоді, коли ваша програма закінчиться, не раніше.