Ваші професори піднімають важливий момент. На жаль, використання англійської мови таке, що я не зовсім впевнений, що саме вони говорять. Дозвольте мені відповісти на питання з точки зору неіграшкових програм, які мають певні характеристики використання пам'яті і з якими я особисто працював.
Деякі програми поводяться приємно. Вони розподіляють пам'ять хвилями: безліч дрібних або середніх розподілів, за якими слідує багато звільнень, у повторюваних циклах. У цих програмах типові розподільники пам'яті працюють досить добре. Вони зливають звільнені блоки, і в кінці хвилі більша частина вільної пам'яті знаходиться великими суміжними шматками. Ці програми досить рідкісні.
Більшість програм поводиться погано. Вони розподіляють і звільняють пам'ять більш-менш випадково, у різних розмірах, від дуже маленьких до дуже великих, і вони зберігають велике використання виділених блоків. У цих програмах можливість злиття блоків обмежена, і з часом вони отримують пам'ять сильно фрагментованою і відносно несумісною. Якщо загальне використання пам’яті перевищує приблизно 1,5 ГБ у 32-розрядному просторі пам’яті, і є розмір (скажімо) 10 МБ або більше, врешті-решт одне з великих виділень не вдасться. Ці програми є загальними.
Інші програми звільняють мало або зовсім не пам'ятають, доки не зупиняться. Вони поступово розподіляють пам’ять під час роботи, звільняючи лише невеликі кількості, а потім зупиняються, і тоді вся пам’ять звільняється. Компілятор такий. Так само і ВМ. Наприклад, середовище виконання .NET CLR, написане на C ++, ймовірно, ніколи не звільняє жодної пам'яті. Чому це потрібно?
І це остаточна відповідь. У тих випадках, коли програма досить важка у використанні пам'яті, тоді управління пам’яттю за допомогою malloc та безкоштовного не є достатньою відповіддю на проблему. Якщо вам не пощастить мати справу з добре поведінковою програмою, вам потрібно буде розробити один або кілька користувацьких розподільників пам'яті, які попередньо розподіляють великі шматки пам'яті, а потім розподіляють відповідно до обраної вами стратегії. Ви можете взагалі не користуватися безкоштовною, крім випадків, коли програма зупиняється.
Не знаючи точно, що сказали ваші професори, для справді виробничих програм я, мабуть, вийшов би на їхній бік.
РЕДАГУВАТИ
Я один раз відповім на деякі зауваження. Очевидно, SO не є гарним місцем для публікацій такого роду. Щоб зрозуміти: я маю близько 30 років досвіду написання такого програмного забезпечення, включаючи пару компіляторів. У мене немає академічних довідок, лише власні синці. Я не можу не відчувати, що критика йде з боку людей із значно вужчим та коротшим досвідом.
Я повторю моє ключове повідомлення: балансування malloc та free не є достатнім рішенням для масштабного розподілу пам'яті у реальних програмах. Злипання блоків нормально, і виграти час, але це НЕ достатньо. Вам потрібні серйозні, розумні розподільники пам’яті, які, як правило, захоплюють пам’ять шматками (використовуючи malloc чи інше) і рідко звільняють. Ймовірно, це послання, яке мали на увазі професори ОП, яке він неправильно зрозумів.