Должен ли я освобождать память перед выходом?

Должен ли я освобождать всю свою разделяемую память, когда я выхожу из программы из-за ошибки?

something = (char**) malloc (x * sizeof(char*)); for (i = 0; i < x; i++) something[i] = (char*) malloc (y + 1); ... if (anything == NULL) { printf("Your input is wrong!"); // should I free memory of every mallocated entity now? exit(1); } else { // work with mallocated entities ... free(something); // it must be here system("pause); } 

Это зависит от ОС. Лучшая практика, я бы сказал, что вы должны явно освободить ее. Он также использует инструменты, такие как valgrind a PITA, если у вас нет памяти, не освобождаемой повсюду, и я не могу сказать, что хорошо и плохо.

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

На самом деле это действительно тяжелый, невесомый вопрос.

Pro (в пользу освобождения всего до выхода):

  • нет ошибок или утечек памяти позже, если код переупорядочен
  • нет ложных срабатываний от проверки герметичности valgrind или памяти
  • нет утечек памяти, если вы работаете под ошибкой ОС или вообще не используете ОС

Con (только выходите, не беспокойтесь о том, чтобы освободить все):

  • освобождение всего может быть большой работой
  • освобождение всего может привести к ошибкам и сбоям
  • ваша ОС действительно, действительно, должна вернуть все ресурсы для вас, когда вы выходите

В конце концов, вам придется решить, какие из этих плюсов и минусов важны для вас. Различные программисты по различным проектам при разных обстоятельствах будут делать разные выводы; здесь нет ответа на один размер.

См. Также вопрос 7.24 в списке часто задаваемых вопросов .

Вам не нужно освобождать память до завершения программы. Прекращение действия программы в любом случае приводит к автоматическому освобождению всей памяти.

Вы должны всегда освобождать выделенную память перед выходом. Как уже упоминалось в других ответах, это минимизирует предупреждения от инструментов статического или динамического анализа и т. Д.

Но настоящая причина, почему вы всегда должны это делать, заключается в том, что освобождение часто выдает бездействующие ошибки во время выполнения в вашем приложении.

Если у вас есть ошибка где-то, что приводит к повреждению памяти или изменению адресов указателей, эта ошибка может оставаться безмолвной и бездействующей. Пока вы не измените что-то совершенно не связанное с ошибкой и тем самым перетасовываете макет памяти. Затем внезапно вы получите сбой, и вы не поймете, почему, потому что ошибка даже не находится в коде, который вы только что добавили.

Освободив память, вы вызываете такие ошибки на поверхность. Потому что, если что-то не так с кучей или с указателями, указывающими на кучу, тогда вы часто получите сбой в точке, где вы вызываете free() . Это означает, что у вас есть серьезная ошибка где-то, что вам нужно найти перед отправкой программы.

У меня был совершенно противоположный сценарий: segfaulting деструкторы статических объектов из сторонней библиотеки. Просто из-за явного освобождения пулов памяти перед выходом. Я считаю, что лучше быть разумным и сосредоточиться на структуре программы.