Должна ли память быть освобождена непосредственно перед оператором return в main? - PullRequest
3 голосов
/ 03 декабря 2011

Рассмотрим эту маленькую программу:

int main(int argc, const char *argv[])
{
    int *i = new int;
    //do something with i, where i is involved all the time
    return 0;
}

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

Но принесет ли это вред, если оставить delete i; вне дома?

ОБНОВЛЕНИЕ: Пожалуйста, не разжигайте друг друга в комментариях. Я знаю, что просто для того, чтобы быть в безопасности, а также в качестве хорошего стиля и так далее, я должен освободить выделенную память. Вопрос в том, можно ли его опустить безопасно в этом конкретном случае.

Ответы [ 8 ]

4 голосов
/ 03 декабря 2011

Это не должно иметь значения, поскольку современные операционные системы, как правило, очищают память программы после ее завершения.При этом я уверен, что некоторые старые системы не не выполняют очистку, поэтому, если вы нацеливаетесь на любую из этих систем, вам определенно нужно быть осторожным.1004 * Независимо от этих двух моментов, вы бы лучше не спали, зная, что ваш код не течет?

3 голосов
/ 03 декабря 2011

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

2 голосов
/ 03 декабря 2011

Ваша память будет освобождена в современной ОС, но это не значит, что деструкторы будут вызываться.

Это плохая практика.Не делай этого.Вместо этого используйте умные указатели.

2 голосов
/ 03 декабря 2011

Там не будет никакого вреда. ОС освобождает всю память процесса, когда он умирает.

Тем не менее, удаление ваших переменных - это плохой стиль, поскольку он препятствует использованию таких инструментов, как Valgrind .

1 голос
/ 03 декабря 2011

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

a) Никогда не тратьте ресурсы системы (память, вычислительная мощность, порты, сокеты ...)

b) Верните то, что вам не нужно, есть другие процессы, выполняющиеся вместе с вашими.

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

1 голос
/ 03 декабря 2011

Если вы используете инструмент отслеживания памяти для обнаружения утечек памяти, несбалансированные выделения / освобождения от вашего верхнего уровня будут отображаться как утечки.Это отвлечет вас от вашей задачи поиска реальных утечек памяти.Кроме этого, вы в безопасности: ОС освободит память и другие ресурсы для вас.

0 голосов
/ 03 декабря 2011

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

так что это больше, чем просто хороший стиль кодирования.

0 голосов
/ 03 декабря 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...