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

Поиск:

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


Опытный
**


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

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



Купник. Изучаем С++
Франка. Самоучитель С++
Шилдт. Базовый курс С++

Добавлено через 1 минуту и 41 секунду
mes, спасибо большоеsmile
PM MAIL   Вверх
mes
Дата 6.5.2009, 01:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Riddik @  5.5.2009,  23:59 Найти цитируемый пост)
почему не virtual void func() {} 

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

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


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


Опытный
**


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

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



mes, ещё раз спасибо за объяснения! 
Значит в любом случае у деструктора должно быть тело ф-ии, даже если это чисто-виртуальный деструктор в абстрактном классе. smile




P.S. Понимаю, что опытных программистов должно бы быть раздражает, когда говорят такие вещи, как  я говорил здесь про память и указатели на неё, вроде "укзатель на базовый класс, ему выделяется память" - на самом деле уж это я понимаю, что выделяется память и адрес этой памяти присваивается указателю, а сказал небрежно, каюсьsmile
PM MAIL   Вверх
mes
Дата 6.5.2009, 01:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Riddik @  6.5.2009,  00:35 Найти цитируемый пост)
Значит в любом случае у деструктора должно быть тело ф-ии, даже если это чисто-виртуальный деструктор в абстрактном классе. smile

Да.

Цитата(Riddik @  6.5.2009,  00:35 Найти цитируемый пост)
на самом деле уж это я понимаю, что выделяется память и адрес этой памяти присваивается указателю, 

Создается объект. А выделение памяти это всего лишь один из этапов создания объекта.  smile 


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


Опытный
**


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

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



Не буду умничатьsmile 
PM MAIL   Вверх
Riddik
Дата 6.5.2009, 02:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



с delete всё нормально - вызывается деструктор, в если очищать вектор - не вызывается

Код

#include <iostream>
#include <vector>
using namespace std;

class base
{
public:
    virtual void vivod()=0;
    virtual ~base() {}
};

class A:public base
{
public:
    void vivod() {cout<<"This is class A"<<'\n';}
    ~A(){cout<<"This is destructor A"<<'\n';}
    A() {cout<<"This is constructor A"<<endl;}
};

class B:public base
{
public:
    void vivod() {cout<<"This is class B"<<'\n';}
    ~B() {cout<<"This is destructor B"<<'\n';}
    B() {cout<<"This is constructor B"<<endl;}
};

int main(int argi, char *argc[])
{
    vector<base*> pb;

    for(int i=0; i<5; i++) pb.push_back(new A);
    cout<<endl;
    for(int i=0; i<5; i++) pb.push_back(new B);

    pb.clear();  

    return 0;
}



Результат: выводит по пять строк "This is constructor А" и "This is constructor B", деструктор молчит.

А если base *p=new A; затем delete p, то всё нормально, деструктор A вызывается

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


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


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

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



Цитата(Riddik @  6.5.2009,  01:07 Найти цитируемый пост)
если очищать вектор - не вызывается

естественно, В векторе Вы храните указатели, а не объекты. За удаление "реальных" объектов он не отвечает.

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


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


Опытный
**


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

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



Не понял, во втором сообщении Вы же ответили "только если он виртуальный в базовом" на вопрос "когда очищается контейнер таким способом, вызывается ли деструктор класса Monstr"

Сорри, уже поздно, наверное я плохо понимаю
PM MAIL   Вверх
mes
Дата 6.5.2009, 02:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Riddik @  6.5.2009,  01:16 Найти цитируемый пост)
е понял, во втором сообщении Вы же ответили

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

Цитата(Riddik @  6.5.2009,  01:16 Найти цитируемый пост)
Сорри, уже поздно, 

Ага, и  на меня тоже сказывается   smile 


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


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


Опытный
**


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

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



Ясноsmile

Вот так нормально самому память освобождать:


Код

vector<base*>::iterator it;
for(it=pb.begin(); it<pb.end(); it++) delete *it;


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


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


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

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



да


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


Опытный
**


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

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



Тогда вопрос решён - спасибо за всёsmile
PM MAIL   Вверх
azesmcar
Дата 6.5.2009, 08:58 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



вот так будет универсальнее, напишите функтор
Код

struct delete_object {
    template <typename T>
    void operator()(T* ptr)    {
        delete ptr;
    }
};

вызов
Код

std::for_each(container.begin(), container.end(), delete_object());

будет работать для любого (STL совместимого) контейнера

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


Опытный
**


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

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



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

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

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

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

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


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

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


 




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


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

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