Страницы

Поиск по вопросам

пятница, 13 декабря 2019 г.

Обязательно ли очищать память перед выходом из программы?

#c


Например:

char **twoarray = (char **) malloc(2 * sizeof(char *)); // выделено
*(twoarray + 0) = (char *) malloc((1 + 1) * sizeof(char)); // выделено
*(twoarray + 1) = (char *) malloc((1 + 1) * sizeof(char)); // не выделено

if (*(twoarray + 1) == NULL) {
    free(*(twoarray + 0)); // очистка
    free(twoarray); // очистка
    exit(-1);
}


Просто, когда работаешь с трёхмерными массивами ещё и в цикле, то очищать становится
сложнее..
    


Ответы

Ответ 1



В принципе не обязательно. Тем более в C, где удаление памяти не связано автоматически с вызовом деструктора. И тем не менее пару причин есть. Во-первых, для выращивания в себе хорошей привычки - поигрался - положи на место. А во-вторых, а вдруг в будущем этот exit(1) превратится всего лишь в return в новой версии? Вспомните ли вы тогда, что там должно быть освобождено?

Ответ 2



Хоть операционная система и высвобождает память и прочие ресурсы при уничтожении адресного пространства процесса, обязательность возврата памяти нужна в случае профилирования утечек памяти. Дело в том, что у ОС нет возможности определить, какие участки памяти оставили умышленно, для оптимизации, а какие остались случайно, из-за потери указателей на них. Поэтому отсутствие очистки перед выходом сильно засоряет отладочный вывод, из-за чего можно пропустить действительно важную запись об утечке.

Ответ 3



Не очищать память - плохой стиль программирования, так как утечка памяти может привести к плохим последствиям( Капитан очевидность)

Комментариев нет:

Отправить комментарий