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