Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вызывается ли деструктор? STL 
V
    Опции темы
Riddik
Дата 6.5.2009, 00:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 598
Регистрация: 2.12.2006

Репутация: нет
Всего: нет



Вопрос, скорее всего, дурацкий, но мне для успокоения smile

Есть два классы, пусть Monstr и Male, в их конструкторе выделяется память, в деструкторе - освобождается.

Эти классы помещаются в контейнер типа вектор, содержащий указатель на базовый класс, из которого выведены Monstr и Male:

Код

std::vector<base*> pbase;
pbase.push_back(new Monstr());
pbase.push_back(new Male());
 

Затем, когда возникает необходимость, контейнер очищается :
Код

pbase.clear();


Вопрос: когда очищается контейнер таким способом, вызывается ли деструктор класса Monstr и деструктор класса Male? Другими словами, та память, что выделяется их конструкторами, освобождается? Или для успокоения написать отдельную функцию, которая будет это делать и вызывать её вместе с очисткой контейнера?

Это сообщение отредактировал(а) Riddik - 6.5.2009, 00:32
PM MAIL   Вверх
mes
Дата 6.5.2009, 00:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Вызов деструктора наследника, будет произведен, только если он помечен виртуальным в базовом.
Вектор указателей, при очищении не удаляет объекты. Это Вы должны сделать самостоятельно.

исправлено



Это сообщение отредактировал(а) mes - 6.5.2009, 02:23


--------------------
PM MAIL WWW   Вверх
Riddik
Дата 6.5.2009, 00:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 598
Регистрация: 2.12.2006

Репутация: нет
Всего: нет



mes, не понял, простите. Если сделать виртуальный деструктор в базовом?
PM MAIL   Вверх
mes
Дата 6.5.2009, 00:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Riddik @  5.5.2009,  23:33 Найти цитируемый пост)
Если сделать виртуальный деструктор в базовом? 

да. (в наследниках он автоматическки получится тоже виртуальный.)


--------------------
PM MAIL WWW   Вверх
Riddik
Дата 6.5.2009, 00:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 598
Регистрация: 2.12.2006

Репутация: нет
Всего: нет



Как же его объявить, возникают ошибки, не хочет компилироваться:
Код

class base
{
public:
  virtual ~base();



или 
Код

virtual ~base()=0;



?

Это сообщение отредактировал(а) Riddik - 6.5.2009, 00:42
PM MAIL   Вверх
mes
Дата 6.5.2009, 00:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Riddik @  5.5.2009,  23:41 Найти цитируемый пост)
Как же его объявить, возникают ошибки, не хочет компилироваться:

Вы ошибки то читаете ? там же ясным языком написано, что нет определения у функции. Или Вы на ощупь программируете ?  smile 
Код

 virtual ~base() {}




--------------------
PM MAIL WWW   Вверх
Riddik
Дата 6.5.2009, 00:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 598
Регистрация: 2.12.2006

Репутация: нет
Всего: нет



И ещё такой момент, есть просто указать на базовый класс, которому выделяется память на производный из него:
Код

base *p=new Monstr();


Затем память удаляется: delete p; 
Естественно, деструктор класса Monstr вызван не будет? То же самое, что с pbase.clear() ?

Добавлено через 2 минуты и 56 секунд
mes, на ощупь, конечно.  smile 
Я, если честно, про такие инструкции  virtual ~base() {} ничего не знаю ещё.

Спасибо  smile

Добавлено через 4 минуты и 13 секунд
Это так же вызовет деструктор classA и при p=new classA;  delete p; ?
PM MAIL   Вверх
mes
Дата 6.5.2009, 00:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Riddik @  5.5.2009,  23:46 Найти цитируемый пост)
на ощупь, конечно.  smile 
Я, если честно, про такие инструкции  virtual ~base() {} ничего не знаю ещё.

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

Цитата(Riddik @  5.5.2009,  23:46 Найти цитируемый пост)
И ещё такой момент, есть просто указать на базовый класс, которому выделяется память на производный из него:

Нет. Есть указатель, котоорый инизиализируется адресом новосозданного объекта.

Цитата(Riddik @  5.5.2009,  23:46 Найти цитируемый пост)
Затем память удаляется: delete p; 
Естественно, деструктор класса Monstr вызван не будет?

при delete автоматически вызывается деструктор. Если он был объявлен как виртуальный, то вызовется и для наследникa (Monstr)

Цитата(Riddik @  5.5.2009,  23:46 Найти цитируемый пост)
То же самое, что с pbase.clear() ?

нет, не то же самое. В delete "скрыт" вызов деструктора, а clear () - обычная функция.


Это сообщение отредактировал(а) mes - 6.5.2009, 00:56


--------------------
PM MAIL WWW   Вверх
Riddik
Дата 6.5.2009, 00:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 598
Регистрация: 2.12.2006

Репутация: нет
Всего: нет



У функции должно быть тело, а как же чисто виртуальные ф-ии

virtual void func()=0;

почему не virtual void func() {}

Добавлено @ 01:10
 smile 
поискал в соседней теме - не нашёл, где мне сообщили о решении подобной проблеме, речь шла об абстрактном классе, а проблема была в том, что его наследники получились тоже абстрактными. Про деструкторы и {} там мне ничего не говорили.

Это сообщение отредактировал(а) Riddik - 6.5.2009, 01:10
PM MAIL   Вверх
J0ker
Дата 6.5.2009, 01:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 9
Всего: 14



Riddik, у вас в голове каша
учите матчасть


--------------------
user posted image
PM MAIL   Вверх
Riddik
Дата 6.5.2009, 01:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 598
Регистрация: 2.12.2006

Репутация: нет
Всего: нет



J0ker,  Да учу я, но и бегу вперёд поезда

Добавлено через 1 минуту и 46 секунд
:(
PM MAIL   Вверх
J0ker
Дата 6.5.2009, 01:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 9
Всего: 14



уясните для начала разницу между pure virtual, virtual и abstract


--------------------
user posted image
PM MAIL   Вверх
Riddik
Дата 6.5.2009, 01:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 598
Регистрация: 2.12.2006

Репутация: нет
Всего: нет



pure virtual, virtual и abstract 
вы будете смеятся, но в тех книжках, которые я уже прочёл, об этом ни слова smile

Добавлено через 21 секунду
вернее только про virtual
PM MAIL   Вверх
J0ker
Дата 6.5.2009, 01:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 9
Всего: 14



значит вы читали что-то не по С++


--------------------
user posted image
PM MAIL   Вверх
mes
Дата 6.5.2009, 01:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Riddik @  5.5.2009,  23:59 Найти цитируемый пост)
У функции должно быть тело, а как же чисто виртуальные ф-ии

Цитата(mes @  5.5.2009,  23:56 Найти цитируемый пост)
У вызываемой  функции должно быть тело

я специально сделал акцент на слово вызываемая. У виртуальных функций, тело связывается с вызовом в рантайме (в отличие от обычных - на этапе линковки).
И чтоб не было возможности вызвать функцию, у которой нет связи с телом, нельзя создавать объекты абстрактных классов.
Да фраза не совсем корректная, но она намекала на возможный ход мыслей, когда бы Вы прочитали ошибку компилятора.
Там написано : не хватает тела функции. Следовательно Вы должны были подумать как объяснить компилятору, где искать.
или написать тело или пометить чисто-виртуальной (ну или и то другое, но Вам это рано)

P.S У деструктора, тело  должно быть всегда, даже когда он помечен, как чистая виртуальная функция.
У виртуальных функций, тело может быть не определено, но должнa быть метка "чистоты" .
Если у класса есть хоть одна функция, помеченная как "чистая", то объект такого класса нельзя создать.





--------------------
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

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

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0553 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.