crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> Корректное удаление виджета
Гость_Гость_*
сообщение 24.9.2009, 8:25
Сообщение #1





Гости








    


Есть базовый виджет

class BaseFormWidget: public QWidget
{
    protected:
        QWebView* webView;
    public:
        BaseFormWidget(QWidget* parent = 0);
        ~BaseFormWidget();
};


Уничтожается так:

BaseFormWidget::~BaseFormWidget()
{
    delete webView;
}


От него наследуется другой виджет:

class frmServiceSelect: public BaseFormWidget
{
    Q_OBJECT

    private:
        std::vector<Button*> *serviceButtons;

        Button* _btnOk;
        Button* _btnBack;
        Button* _btnCancel;

        int _index;

    public:
        frmServiceSelect(QWidget *parent = 0, QDomNode *node = NULL, int id = 0);
        ~frmServiceSelect();

    public slots:
        void slotDestroy();
};


При нажатии на кнопку вызывается слот SlotDestroy, который вызывает деструктор:

frmServiceSelect::~frmServiceSelect()
{
    delete serviceButtons;
    delete _btnOk;
    delete _btnBack;
    delete _btnCancel;
}

void frmServiceSelect::slotDestroy()
{
    delete this;
}


При каждом цикле создания и удаления frmServiceSelect программа память освобождается не полностью. то 10-12 кб прибавляется к объему потребляемой оперативки, то 60-80... Как корректно подчистить память?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
SABROG
  опции профиля:
сообщение 25.9.2009, 20:45
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Цитата(BRE @ 25.9.2009, 20:47) *
Из цикла обработки событий вызывается обработчик события таймера для объекта movie, он посылает сигнал frameChanged, это разворачивается в прямой вызов метода myslot2, из которого мы убиваем объект movie.


А можете мне объяснить подробней, я не разобрался? Вот мы запускаем таймер тут:

movie->start();


Он срабатывает при выходе из конструктора QLabel, когда заходим в цикл событий. При первом событии таймера movie удаляется, значит вместе с ним должен удалиться и таймер и краша быть не должно... В чем подводный камень?
---
А похоже понял. Внутренний вызов из метода QMovie метода myslot2 и возврат в уже не валидный объект.

Сообщение отредактировал SABROG - 25.9.2009, 20:53
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 25.9.2009, 21:05
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(SABROG @ 25.9.2009, 21:45) *
Он срабатывает при выходе из конструктора QLabel, когда заходим в цикл событий. При первом событии таймера movie удаляется, значит вместе с ним должен удалиться и таймер и краша быть не должно... В чем подводный камень?

DirectConnectin - подразумевает прямое связывание, т.е. грубо говоря emit signal() разворачивается в функцию:
void signal()
{
    obj->slot();    
}

Из eventloop'а активируется таймер объекта movie, мы попадаем в метод _q_loadNextFrame() объекта movie (!), из него идет прямой вызов метода slot2, в котором мы убиваем объект movie. После этого начинается откат из метода slot2, должны вернуться в _q_loadNextFrame объекта movie и продолжить выполнение этого метода. А movie - убит. Приплыли.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- Гость   Корректное удаление виджета   24.9.2009, 8:25
- - BRE   Цитата(Гость @ 24.9.2009, 9:25) void frmS...   24.9.2009, 8:34
- - kwisp   а почему ты в диструкторе уничтожаешь объекты? Bas...   24.9.2009, 9:02
- - Гость   Паренты имеются, конечно же. А уничтожаю я так, дл...   24.9.2009, 9:35
- - Гость   Скачал Deleaker - буду искать утечки   24.9.2009, 9:40
- - kwisp   Цитата(Гость_Гость_* @ 24.9.2009, 10:35) ...   24.9.2009, 9:42
|- - Гость   Цитата(kwisp @ 24.9.2009, 9:42) я бы для ...   24.9.2009, 9:49
|- - SABROG   Цитата(kwisp @ 24.9.2009, 10:42) delete w...   24.9.2009, 10:43
- - kwisp   Цитата(SABROG @ 24.9.2009, 11:43) Цитата(...   24.9.2009, 10:58
|- - BRE   Цитата(kwisp @ 24.9.2009, 11:58) а второй...   24.9.2009, 11:10
- - kwisp   Цитата(BRE @ 24.9.2009, 12:10) Удаление н...   24.9.2009, 13:24
- - Litkevich Yuriy   Цитата(kwisp @ 24.9.2009, 17:24) а зачем ...   24.9.2009, 13:30
- - kwisp   RE: Корректное удаление виджета   24.9.2009, 13:33
- - igor_bogomolov   Всегда считал, что удалять классы потомки от QObje...   24.9.2009, 21:25
|- - BRE   Цитата(igor_bogomolov @ 24.9.2009, 22:25)...   24.9.2009, 21:53
- - Litkevich Yuriy   Цитата(BRE @ 25.9.2009, 1:53) Если сейчас...   24.9.2009, 22:16
|- - BRE   Цитата(Litkevich Yuriy @ 24.9.2009, 23:16...   24.9.2009, 22:38
- - Litkevich Yuriy   Сейчас глянул код деструктора - он давольно наворо...   24.9.2009, 23:52
- - SABROG   Ага, а потом делать рефакторинг приложения, если з...   25.9.2009, 9:14
|- - BRE   Цитата(SABROG @ 25.9.2009, 10:14) Ага, а ...   25.9.2009, 9:25
- - SABROG   Лучше, когда этих телодвижений меньше. Code less -...   25.9.2009, 10:46
- - igor_bogomolov   Цитата(BRE @ 24.9.2009, 22:53) Если сейча...   25.9.2009, 19:08
- - Litkevich Yuriy   Цитата(BRE @ 25.9.2009, 23:47) это развор...   25.9.2009, 20:02
- - igor_bogomolov   Понятно. Сколько интересно подобных объектов в Qt...   25.9.2009, 20:06
|- - BRE   Цитата(igor_bogomolov @ 25.9.2009, 21:06)...   25.9.2009, 20:20
- - igor_bogomolov   Я понимаю, что я уже придираюсь, и что это ошибки ...   25.9.2009, 20:28
- - SABROG   Цитата(BRE @ 25.9.2009, 20:47) Из цикла о...   25.9.2009, 20:45
- - BRE   Цитата(SABROG @ 25.9.2009, 21:45) Он сраб...   25.9.2009, 21:05


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


8 чел. читают эту тему (гостей: 8, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 18.10.2024, 11:33