Это то, что беспокоило меня целую вечность.
Мы все учимся в школе (по крайней мере, я был), что вы ДОЛЖНЫ освобождать каждый указатель, который выделяется. Мне немного любопытно, правда, о реальной стоимости освобождения памяти. В некоторых очевидных случаях, например, когда malloc
вызывается внутри цикла или части выполнения потока, очень важно освободиться, чтобы не было утечек памяти. Но рассмотрим следующие два примера:
Во-первых, если у меня есть код, что-то вроде этого:
int main()
{
char *a = malloc(1024);
/* Do some arbitrary stuff with 'a' (no alloc functions) */
return 0;
}
Каков реальный результат здесь? Мое мышление состоит в том, что процесс умирает, а затем пустое пространство уходит в любом случае, поэтому нет никакого вреда в пропуске вызова free
(однако я действительно признаю важность его наличия в любом случае для закрытия, ремонтопригодности и хорошей практики). Правильно ли я в этом мышлении?
Во-вторых, скажем, у меня есть программа, которая немного похожа на оболочку. Пользователи могут объявлять переменные типа aaa = 123
, и они сохраняются в некоторой динамической структуре данных для последующего использования. Очевидно, что вам нужно использовать какое-то решение, которое вызовет некоторую функцию * alloc (hashmap, связанный список, что-то вроде этого). Для такого рода программ не имеет смысла когда-либо освобождаться после вызова malloc
, поскольку эти переменные должны присутствовать всегда во время выполнения программы, и нет хорошего пути (который я вижу) для реализации этого со статически распределенным пространство. Это плохая конструкция, чтобы иметь кучу памяти, которая была выделена, но только освобождена как часть завершения процесса? Если да, то какая альтернатива?