crossplatform.ru

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

3 страниц V   1 2 3 >  
Ответить в данную темуНачать новую тему
> Корректное удаление виджета
Гость_Гость_*
сообщение 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... Как корректно подчистить память?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 24.9.2009, 8:34
Сообщение #2


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

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

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




Репутация:   44  


Цитата(Гость @ 24.9.2009, 9:25) *
void frmServiceSelect::slotDestroy()
{
    delete this;
}

Не хорошо так удалять самого себя. Лучше воспользоваться методом QObject::deleteLater().

Утечки памяти лучше смотреть с помощью специальных средств.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 24.9.2009, 9:02
Сообщение #3


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

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




Репутация:   23  


а почему ты в диструкторе уничтожаешь объекты?
BaseFormWidget::~BaseFormWidget() {     delete webView; }
frmServiceSelect::~frmServiceSelect() {     delete serviceButtons;     delete _btnOk;     delete _btnBack;     delete _btnCancel; }

у тебя что webView, serviceButtons, _btnOk, _btnBack, _btnCancel
не имеют parent`a ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Гость_*
сообщение 24.9.2009, 9:35
Сообщение #4





Гости








    


Паренты имеются, конечно же. А уничтожаю я так, для надежности :lol:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Гость_*
сообщение 24.9.2009, 9:40
Сообщение #5





Гости








    


Скачал Deleaker - буду искать утечки
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 24.9.2009, 9:42
Сообщение #6


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

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




Репутация:   23  


Цитата(Гость_Гость_* @ 24.9.2009, 10:35) *
Паренты имеются, конечно же. А уничтожаю я так, для надежности

я бы для надежности тогда уже писал
delete webView;
delete webView;

чтоб наверняка грохнуть!
:lol:
дока.
Цитата
Member Function Documentation
Q_INVOKABLE QObject::QObject ( QObject * parent = 0 )
Constructs an object with parent object parent.
The parent of an object may be viewed as the object's owner. For instance, a dialog box is the parent of the OK and Cancel buttons it contains.
The destructor of a parent object destroys all child objects.
Setting parent to 0 constructs an object with no parent. If the object is a widget, it will become a top-level window.
See also parent(), findChild(), and findChildren().

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Гость_*
сообщение 24.9.2009, 9:49
Сообщение #7





Гости








    


Цитата(kwisp @ 24.9.2009, 9:42) *
я бы для надежности тогда уже писал
delete webView;
delete webView;

чтоб наверняка грохнуть!
:lol:


Я об этом уже тоже стал подумывать :lol:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 24.9.2009, 10:43
Сообщение #8


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

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

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




Репутация:   34  


Цитата(kwisp @ 24.9.2009, 10:42) *
delete webView;
delete webView;


Так надежности как раз не будет, так как программа просто упадет :unsure:

Вот если только так:

delete webView;
webView = 0;
delete webView;


А для указателей не на объекты на базе QObject'a можно использовать QSharedPointer.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 24.9.2009, 10:58
Сообщение #9


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

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




Репутация:   23  


Цитата(SABROG @ 24.9.2009, 11:43) *
Цитата(kwisp @ 24.9.2009, 10:42) *
delete webView;
delete webView;
Так надежности как раз не будет, так как программа просто упадет :unsure:

это же шутка была!.

конечно упадет(в лучшем случае) а может и просто бед натворить по уничтожению других объектов.
а второй твой вариант тоже не зачем:)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 24.9.2009, 11:10
Сообщение #10


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

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

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




Репутация:   44  


Цитата(kwisp @ 24.9.2009, 11:58) *
а второй твой вариант тоже не зачем:)

Удаление нулевого указателя валидная операция. ;)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 27.12.2024, 16:54