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