Почему мы должны использовать деструкторы для освобождения памяти в C++,
Как мы можем использовать
delete or delete[]
Не правда ли, что вся память, используемая программой, освобождается, когда программа завершается.
Почему мы должны использовать деструкторы для освобождения памяти в C++,
Как мы можем использовать
delete or delete[]
Не правда ли, что вся память, используемая программой, освобождается, когда программа завершается.
"мы используем деструкторы для освобождения памяти"
На самом деле вы пишете о функциях освобождения operator delete
и operator delete[]
.
"Разве не правда, что вся память, используемая программой, освобождается при завершении программы?"
Насколько я знаю, это зависит от ОС, но дело не в том, что происходит после завершения программы. Дело в том, что происходит во время выполнения. Есть много приложений, которые работают в течение нескольких часов или даже недель, и утечки памяти могут иметь очень неприятные последствия в них (не то чтобы утечки памяти не были неприятными с точки зрения других программ).
Когда ваша программа достигает точки, когда ресурсы, которые вы выделили, больше не нужны, вы должны сделать все возможное, чтобы освободить их, используя соответствующие средства. И как только ваша программа завершится: Полагаться на то, что ОС очистит ваш беспорядок, похоже, не очень хорошая практика ;)
Очень часто недостаточно вернуть память только после того, как ваша программа завершится. Большинству программ, предназначенных для непрерывной работы, необходимо выделять временную память переменного размера без определенного срока службы этой памяти. Очевидно, что если вы запрашиваете память и не возвращаете ее в течение значительного времени, вашей программе не хватит памяти, и она завершится, когда запросит дополнительную память.
При этом вы можете пройти долгий путь без использования деструкторов в C++, выделив все, что вы можете выделить, в автоматическую область. Единственный случай, когда вам действительно нужно использовать динамическую память, — это когда время жизни объекта должно выходить за пределы области его выделения, но даже в этом случае контейнеры C++ позаботятся о большинстве выделений за вас (конечно, реализация стандартных контейнеров в значительной степени зависит от инфраструктура конструктора/деструктора языка C++).
Деструкторы гарантированно вызываются, если используется RAII. Мы не обязаны его использовать, но, как правило, полезно использовать RAII, поскольку он позволяет автоматически управлять ресурсами. Другими словами, если вы правильно напишете свою программу, в ней не будет утечек ресурсов или памяти, так что вам даже не придется об этом беспокоиться.
Это верно не только для C++, но и для других языков, поддерживающих автоматическое управление ресурсами, таких как C#, Java и даже C (посредством нестандартных расширений).
По сути, вам нужно прочитать какую-нибудь книгу по C++, чтобы понять концепцию, вероятно. Я также написал небольшую статью, которая может оказаться полезной, см. здесь.
Надеюсь, поможет :)
Прежде всего, delete
и delete[]
не являются деструкторами, они просто вызывают деструкторы удаляемых экземпляров (учитывая, что у них есть деструкторы).
Чтобы ответить на ваш главный вопрос: деструктор класса может делать больше, чем просто освобождать память. Например, это может сигнализировать другой программе, что она собирается закрыть соединение или что-то в этом роде.
Кроме того, некоторые программы работают "вечно" или, по крайней мере, так долго, как это возможно. Я, например, разрабатываю программы, которые работают на серверах и они (надеюсь) работают месяц. Мне нужно освободить память (или другие ресурсы) как можно скорее, иначе процесс будет расти и в конечном итоге выйдет из строя, когда на машине закончится память.
delete
, у вас будет утечка памяти. - person nhgrif   schedule 14.10.2013delete
одновременно вызывает деструкторы и освобождает память, но вы можете освобождать память без вызова деструкторов, и вы можете вызвать деструктор без использованияdelete
. - person hyde   schedule 14.10.2013