Каждый из конструкторов создает динамический массив и заполняет его значениями. Доступ к динамическому массиву выполняется по закрытому указателю data. Однако выделенную память надо возвращать, чтобы в нашем классе не возникала утечка памяти. Клиент этого делать не может, так как доступа к указателю у него нет. Да и нельзя этот доступ клиенту давать — этим мы грубо нарушим принцип инкапсуляции. Возвращать память должен сам наш класс.
Как раз для этих целей и предназначен деструктор (см. главу 2). Напомним: конструктор создает объект, деструктор его уничтожает (см. п. 12.4 в [1]). Деструктор вызывается автоматически при каждом уничтожении объекта. Для локальных объектов это делается при выходе из блока, а для динамических, которые клиент создает посредством операции new (или new[]), — при каждом вызове операции delete (или delete []). Текст деструктора приведен в листинге 5.6. Листинг 5.6. Деструктор ТАггау::-ТАггау()
{ delete[]data; // освобождаем память
data =0
Деструктор очень короткий, поэтому его можно реализовать непосредственно в классе. Единственное его назначение (и действие) — возвращать память, которую запрашивает конструктор при создании массива. Обнуление указателя, как написано у нас, делать не обязательно.
Отметим, что мы не писали деструкторы ни для класса ТМопеу (см. листинг 1.15), ни для класса TSt г i ng (см. листинг 4.2). Если деструктор не реализован, создается стандартный деструктор по умолчанию (см. п. п. 12.4/3 в [1]), который и вызывается при уничтожении объекта. Такой деструктор «ничего не делает» [2]. Для нашего «умного» динамического массива автоматический деструктор не подходит, так как он не выполняет операцию delete [ ] — мы это должны делать сами явным образом.
Вообще деструкторы необходимо определять для каждого класса, конструкторы которого запрашивают какие-нибудь ресурсы, подлежащие возврату. Чаще всего — это память. Но мы увидим далее, что деструкторы полезны и в некоторых других случаях.
Опубликовал Kest
October 14 2013 21:23:49 ·
0 Комментариев ·
3866 Прочтений ·
• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •
Комментарии
Нет комментариев.
Добавить комментарий
Рейтинги
Рейтинг доступен только для пользователей.
Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.
Нет данных для оценки.
Гость
Вы не зарегистрированны? Нажмите здесь для регистрации.