освобождение памяти при использовании exit (1), c ++ - PullRequest
3 голосов
/ 14 сентября 2011

Я работаю над школьным заданием, и нам сказали, что всякий раз, когда у нас возникает ошибка ввода, мы должны напечатать сообщение и выйти из программы.Очевидно, я использую exit (1), но проблема в том, что у меня возникают утечки памяти при использовании этой функции.Я не понимаю, почему - каждая переменная, которую я использовал, была в стеке, а не в куче.

Что я должен сделать, чтобы предотвратить утечки памяти?Спасибо!

Ответы [ 4 ]

7 голосов
/ 14 сентября 2011

exit не не вызывает деструкторы каких-либо стековых объектов, поэтому, если эти объекты распределили внутреннюю память, да, эта память будет утечка.

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

exit не очень хорошо сочетается с c ++ по этой причине.Лучше просто позволить вашей программе возвращаться из основного режима в выходной, или если вам нужно выйти из внутренней функции, которая выдает исключение, что приведет к тому, что стек вызовов будет размотан, и, следовательно, будут вызваны деструкторы.

7 голосов
/ 14 сентября 2011

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

РЕДАКТИРОВАТЬ: Из ваших комментариев, я могу понять, что вы обеспокоены тем, что ваши объекты не уничтожены до завершения (т.е. их деструктор не вызывается).Это, однако, не является утечкой памяти, так как память освобождается процессом и становится доступной для системы.Если вы полагаетесь на деструкторы объектов для выполнения операций, важных для вашего рабочего процесса, я предлагаю вместо кода exit возвращать код ошибки и распространять этот код ошибки до main ().

В соответствии со стандартом вызов метода exit () при уничтожении объекта со статической продолжительностью хранения приводит к неопределенному поведению.Ты это делаешь?

4 голосов
/ 14 сентября 2011

Решение состоит в том, чтобы вообще не использовать exit().Вы пишете свою программу, используя RAII (используйте классы для управления ресурсами), и выдает исключение, когда что-то идет не так.Затем вся память восстанавливается благодаря вызываемым деструкторам.

0 голосов
/ 14 сентября 2011

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

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