Зачем деструкторы нужны в C++?

Почему мы должны использовать деструкторы для освобождения памяти в C++,

Как мы можем использовать

delete or delete[]   

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


person FutureSci    schedule 14.10.2013    source источник
comment
Что, если я создам ваши объекты в цикле, который будет выполняться столько же, сколько и программа (скажем, создание объектов рисования для обновления моего окна)? И для ОС не требуется очистка, но есть очень хороший шанс, что это произойдет.   -  person chris    schedule 14.10.2013
comment
Нет. Память в стеке, которую использует ваша программа, освобождается, когда программа завершается, но память, которую ваша программа резервирует в куче, освобождается, когда и только когда вы ее используете. Если вы этого не сделаете delete, у вас будет утечка памяти.   -  person nhgrif    schedule 14.10.2013
comment
возможный дубликат деструкторов в C++   -  person    schedule 14.10.2013
comment
Это важно для детерминированного управления ресурсами, основанного на области видимости языка. Это позволяет вам контролировать время жизни объектов (и связанных с ними ресурсов, если таковые имеются) простым и понятным способом. Оказывается, это весьма полезно.   -  person juanchopanza    schedule 14.10.2013
comment
Это зависит от ОС, и хотя большинство ОС освобождает всю память, выделенную программе при выходе, вы должны понимать, что ваша программа запускается не одна, на компьютере есть другие люди, а ресурсы (память) являются общими. , так что попробуй оптимизировать тогда ;)   -  person Mario Corchero    schedule 14.10.2013
comment
Вы немного запутались в деструкторах и освобождении памяти, это две разные вещи. При обычном использовании delete одновременно вызывает деструкторы и освобождает память, но вы можете освобождать память без вызова деструкторов, и вы можете вызвать деструктор без использования delete.   -  person hyde    schedule 14.10.2013
comment
@nhgrif: Нет, совсем не так, если у вас есть операционная система, которая в любом случае компетентна.   -  person Benjamin Lindley    schedule 14.10.2013
comment
@BenjaminLindley: Даже если ваша ОС устраняет утечку памяти, это все равно утечка памяти (в рамках вашей программы)! С таким же успехом можно утверждать, что утечек памяти никогда не бывает, потому что вы всегда можете выключить компьютер, чтобы стереть всю оперативную память; Я не думаю, что это чучело — дело в том, что термин «утечка памяти» по своей сути не означает утечку памяти, которая продолжает существовать в течение определенного периода времени.   -  person Lightness Races in Orbit    schedule 15.01.2014
comment
@LightnessRacesinOrbit: это было несколько месяцев назад, но я полагаю, что спорил с утверждением но память, которую ваша программа резервирует в куче, освобождается тогда и только тогда, когда вы используете ее удаление., а не если это так. следует называть утечкой памяти, если вы этого не делаете.   -  person Benjamin Lindley    schedule 15.01.2014
comment
@BenjaminLindley: О, верно: если честно, я даже не заметил этого нюанса в исходном комментарии.   -  person Lightness Races in Orbit    schedule 15.01.2014


Ответы (4)


"мы используем деструкторы для освобождения памяти"

На самом деле вы пишете о функциях освобождения operator delete и operator delete[].

"Разве не правда, что вся память, используемая программой, освобождается при завершении программы?"

Насколько я знаю, это зависит от ОС, но дело не в том, что происходит после завершения программы. Дело в том, что происходит во время выполнения. Есть много приложений, которые работают в течение нескольких часов или даже недель, и утечки памяти могут иметь очень неприятные последствия в них (не то чтобы утечки памяти не были неприятными с точки зрения других программ).

Когда ваша программа достигает точки, когда ресурсы, которые вы выделили, больше не нужны, вы должны сделать все возможное, чтобы освободить их, используя соответствующие средства. И как только ваша программа завершится: Полагаться на то, что ОС очистит ваш беспорядок, похоже, не очень хорошая практика ;)

person LihO    schedule 14.10.2013
comment
Полагаться на ОС, которая (по крайней мере, с точки зрения памяти) не пытается навести порядок в вашем беспорядке, также является плохой практикой :) - person Daniel Frey; 14.10.2013
comment
@DanielFrey: Мое эмпирическое правило: я всегда убираю беспорядок, который я вызвал, независимо от окружающей среды: D - person LihO; 14.10.2013
comment
Конечно, я тоже, но, к сожалению, не все так думают. Поэтому я хочу, чтобы ОС была подстраховкой, учитывая, что даже я совершаю ошибки :-P - person Daniel Frey; 14.10.2013

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

При этом вы можете пройти долгий путь без использования деструкторов в C++, выделив все, что вы можете выделить, в автоматическую область. Единственный случай, когда вам действительно нужно использовать динамическую память, — это когда время жизни объекта должно выходить за пределы области его выделения, но даже в этом случае контейнеры C++ позаботятся о большинстве выделений за вас (конечно, реализация стандартных контейнеров в значительной степени зависит от инфраструктура конструктора/деструктора языка C++).

person Sergey Kalinichenko    schedule 14.10.2013

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

Это верно не только для C++, но и для других языков, поддерживающих автоматическое управление ресурсами, таких как C#, Java и даже C (посредством нестандартных расширений).

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

Надеюсь, поможет :)

person Community    schedule 14.10.2013

Прежде всего, delete и delete[] не являются деструкторами, они просто вызывают деструкторы удаляемых экземпляров (учитывая, что у них есть деструкторы).

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

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

person Daniel Frey    schedule 14.10.2013