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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не попадает управление в деструкторы 
V
    Опции темы
ksili
Дата 1.12.2008, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

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



Я как бы доделываю чужой проект. Там сделаны свои визуальные компоненты, т.е. интерфейс. Используется шаблон ControlsFactory. При инициализации приложения создаются все нужные контролы, и они соответственно хранятся в объекте класса ControlsFactory. 

Сегодня я обнаружил, что из под них не освобождается память. Везде в классах контролов заполнил деструкторы, где это было необходимо. Ну и соответственно в деструкторе ControlsFactory прописал удаление всех контролов. Потом поставил на всё это дело брекпойнты и обнаружил, что ни в один из деструкторов управление не попадает! И вот сейчас я в думках. Это такая особенность MS VS 2005 - "нет брякам в деструкторах", или это я где-то недописал глобальный delete, который и спровоцирует удаление всего и вся?
Я до этого не программировал в MS VS 2005, и с шаблонами дела не имел. Так что сильно не пинайте.


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
vinter
Дата 1.12.2008, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

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



Цитата(ksili @  1.12.2008,  14:06 Найти цитируемый пост)
"нет брякам в деструкторах"

нет такого, твоя вина что не попадает, ищи ошибку


--------------------
Мой блог
PM MAIL WWW   Вверх
ksili
Дата 1.12.2008, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

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



Я так и предполагал, поэтому пытаюсь найти, чего не хватает.

У меня есть класс GUI, который содержит все основные обеъкты. Вот его объявление:
Код

class GUI
{
public:
    static MyGUI_lib::ControlsFactory* pControlsFactory;
    static MyGUI_lib::SettingsControl* pSettingsControl;
    static MyGUI_lib::Control* pSolidColorControl;
    static IConfig* pConfig;
    static MyGUI_lib::IEffect* pEffect;
public:
    static void Init(HWND hwnd);
};

Функция GUI::Init вызывается из основного юнита проекта в InitInstance, перед ShowWindow. В ней инициализируются все члены класса GUI и pControlsFactory заполняется контролами.
Соответственно я предположил, что не хватает деструктора класса GUI, в котором бы все это удалялось, а он бы вызывался, когда приложение уничтожается (WM_CLOSE). Но не всё так просто. Деструктор я добавил:
Код

GUI::~GUI(void)
{
 if(pEffect)            delete pEffect;
 if(pConfig)            delete pConfig;
 if(pSolidColorControl)    delete pSolidColorControl;
 if(pSettingsControl)    delete pSettingsControl;
 if(pControlsFactory)    delete pControlsFactory;
}

Пытаюсь его вызвать
Код

GUI::~GUI();

Ошибка - error C2352: 'GUI::~GUI' : illegal call of non-static member function
Если перед объявлением прописать static, то добавляется ошибкаerror C2574: 'GUI::~GUI(void)' : cannot be declared static

Как же мне вызвать этот деструктор? Или я вообще не то делаю?



--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
mes
Дата 1.12.2008, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(ksili @  1.12.2008,  13:37 Найти цитируемый пост)
Ошибка - error C2352: 'GUI::~GUI' : illegal call of non-static member function
Если перед объявлением прописать static, то добавляется ошибкаerror C2574: 'GUI::~GUI(void)' : cannot be declared static

Как же мне вызвать этот деструктор? Или я вообще не то делаю?

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

GUI * Gui  = new GUI ();  // создали в куче
delete Gui; // удаляем - деструктор вызван автоматически
или
GUI  Gui; // создали на стеке, удалится сам при выходе за границу блока 



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


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

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



mes, я уже и сам понял, что объекта-то и нету  smile 
Но я уже нашёл выход. Там где хотел вызвать деструктор, просто вместо этого прописал его код, благо он небольшой. Но теперь другая проблема. Делаю проход по списку контролов, чтобы их удалить, но чё-то на первом же контроле все сыпется:
Код

    list<Control*>::iterator it;

    // удаляем все контролы из списка
    for (it = _controls.begin(); it != _controls.end(); it++)
    {
        delete (*it);
    }


Это сообщение отредактировал(а) ksili - 1.12.2008, 14:10


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
ksili
Дата 1.12.2008, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

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



Похоже там списке контрол какой-то косячный. 
Ладно, вопрос по теме решён, так что помечаю как решённый.


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
bsa
Дата 1.12.2008, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



Проверь, возможно, у базового класса деструктор не помечен виртуальным. В этом случае, деструкторы потомков вызываться не будут, если удалять объект по указателю на базовый класс:
Код
struct A
{
    ~A() { std::cout << "~A()" << std::endl; }
};

struct B : public A
{
    ~B() { std::cout << "~B()" << std::endl; }
};

int main()
{
   A *p = new B;
   delete p;
   return 0
}
Данный код выведет только "~A()", а если в третьей строке поставить ключевое слово virtual, то будут вызваны оба деструктора.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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