Russian Qt Forum
Ноябрь 26, 2024, 02:29 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 2 [3] 4   Вниз
  Печать  
Автор Тема: Удаление классов в Qt  (Прочитано 31819 раз)
Evgeniya
Гость
« Ответ #30 : Август 14, 2009, 09:28 »

А если мне l нужна как глобальная переменная....то как мне ее задать ??
А зачем это тебе?
В методе add ты создаешь и убиваешь этот объект, т.е. живет он только в момент выполнения add.

я просто потом использую метод класса LS в классе Roszdrav
Записан
Evgeniya
Гость
« Ответ #31 : Август 14, 2009, 09:29 »

И еще ...У меня LS может вызываться еще и со вторым параметром (LS(QWidget *parent, QString mnnID))...
С С++ я возможно пока не очень дружу-только учуся, а с освобождением памяти так вообще тяжко,никогда этому внимания особого не уделяла...а тут у меня просто много классов и боюсь большой утечки памяти....
даж не знаю, можт все-таки указатели оставить LS *l...и когда она мне не нужна убивать ее???как вообще все-таки лучше сделать?Непонимающий
Записан
BRE
Гость
« Ответ #32 : Август 14, 2009, 09:34 »

я просто потом использую метод класса LS в классе Roszdrav
Т.е. ты хочешь один раз создать объект LS и использовать его в нескольких местах?

Тогда, есть несколько вариантов:
* Можно создавать объект LS в конструкторе Roszdrav.
   Плюс: простота.
   Минус: если методы объекта LS в данный момент не нужны, обхект все равно будет создан.
* Можно использовать singleton.
   Плюс: объект LS будет создан при первой необходимости.
   Минус: дополнительные телодвижения в коде.  Улыбающийся
Записан
BRE
Гость
« Ответ #33 : Август 14, 2009, 09:35 »

И еще ...У меня LS может вызываться еще и со вторым параметром (LS(QWidget *parent, QString mnnID))...

Код:
void Roszdrav::add()
{
    LS l( this );
    ....
}

void Roszdrav::edit( const QString &mnnID )
{
    LS l( this, mnnID );
    ....
}
Записан
Evgeniya
Гость
« Ответ #34 : Август 14, 2009, 09:36 »

А если я все-таки буду использовать указатель???то будут сплошные минусы??))))
Записан
BRE
Гость
« Ответ #35 : Август 14, 2009, 09:37 »

А если я все-таки буду использовать указатель???то будут сплошные минусы??))))
Если будешь правильно использовать, то только плюсы.  Подмигивающий
Записан
Evgeniya
Гость
« Ответ #36 : Август 14, 2009, 09:40 »

А правильно - это значит удалять его, когда он мне не нужен?? через delete...

A объект QSqlQueryModel *ls мне не нужно будет удалять?
Записан
BRE
Гость
« Ответ #37 : Август 14, 2009, 10:32 »

А правильно - это значит удалять его, когда он мне не нужен?? через delete...

A объект QSqlQueryModel *ls мне не нужно будет удалять?
Qt сильно расслабляет с механизмом удаления детей parent'ом.

Если ты указала parent при конструировании (в любом наследнике от QObject), то Qt гарантирует его уничтожение при уничтожении самого parent'а. До этого момента все эти объекты будут болтаться в памяти. Если тебе нужно уничтожить объект раньше (при жизни parent'а), то это можно сделать оператором delete.
Например:
Код
C++ (Qt)
void Roszdrav::add()
{
   l = new LS( this );
   ...
   // delete l - не делаем!
}
 
Тогда, получиться что при жизни объекта Roszdrav сколько раз вызовется слот add, столько объектов LS и будет создано. Они все потом удаляться при разрушении объекта Roszdrav, но зачем они нам все нужны?!  Подмигивающий

Во всех остальных случаях удалять объекты нужно самой.
Записан
SABROG
Гость
« Ответ #38 : Август 14, 2009, 10:58 »

Не может такого быть.
Докажи это.

Цитировать
А так будет ошибка
Код
C++ (Qt)
void d (void) {
 Obj->deleteLater();
 QApplication::processEvents();
 Obj->deleteLater();
}
 

Не будет. processEvents() не обрабатывает deffered deletion. Должен быть полный возврат в основной цикл событий. Отдельно выделенный QEventLoop также не удаляет объекты. Удаление происходит только в том цикле событий в котором был вызвал deleteLater().

Цитата: BRE
Можно, но не ...
Какой смысл удалять QObject моментально? Сомневаюсь, что у тебя будет фабрика этих объектов, где количество их будет исчисляться тысячами. QObject - очень медленно создается. Исходя из этого у тебя будут единичные экземпляры, смысла удалять которые самому с целью экономии памяти нет. Думаю в 90% случаев при написании программ на Qt лучше использовать deleteLater() во избежание дальнейших проблем с поиском причин падений своего приложения.
Записан
Evgeniya
Гость
« Ответ #39 : Август 14, 2009, 11:02 »

Просто Roszdrav также вызывается из другой формы...и при зарытии формы(нажатии на крестик) разве удалится QSqlQueryModel *ls..я так полагаю что нет, она удалится только если удалится форма ее вызывающая...а та в свою очередь может быть вызвана еще из одной формы))))
значит ls можно удалить при закрытии, т.е. в методе QCloseEvent, чтобы не было создано много объектов QSqlQueryModel....
Например:
Код
C++ (Qt)
void Roszdrav::add()
{
   l = new LS( this );
   ...
   // delete l - не делаем!
}
 
так лучше не стоит удалять объект LS самой???
Записан
BRE
Гость
« Ответ #40 : Август 14, 2009, 11:20 »

Просто Roszdrav также вызывается из другой формы...и при зарытии формы(нажатии на крестик) разве удалится QSqlQueryModel *ls..я так полагаю что нет, она удалится только если удалится форма ее вызывающая...а та в свою очередь может быть вызвана еще из одной формы))))
значит ls можно удалить при закрытии, т.е. в методе QCloseEvent, чтобы не было создано много объектов QSqlQueryModel....
Если у объекта будет установлен WA_DeleteOnClose, то объект разрушиться при закрытии и разрушит всех детей.

так лучше не стоит удалять объект LS самой???
Сто раз пользователь нажмет add, будет создано сто объектов LS, доступа к которым не будет.
Это нужно? По мне - нет.

Если ты подробней распишешь, что нужно в классе Roszdrav (для чего делать указатель на LS публичным, кто еще им может пользоваться и т.д.), то проще будет рекомендовать что-то конкретное.
Записан
Evgeniya
Гость
« Ответ #41 : Август 14, 2009, 14:08 »

Спасибо огромное,BRE...
Вроде разобралась!!!!!И даже обнаружила, что в некоторых местах действительно можно без выделения памяти обойтись, при вызове формы  Веселый
Записан
spectre71
Гость
« Ответ #42 : Август 14, 2009, 14:31 »

Не будет. processEvents() не обрабатывает deffered deletion. Должен быть полный возврат в основной цикл событий. Отдельно выделенный QEventLoop также не удаляет объекты. Удаление происходит только в том цикле событий в котором был вызвал deleteLater().
Если и так. То другой вариант, вторично вызвать Obj->deleteLater(); по таймеру. Улыбающийся Тут уж точно глюкнет. И это не единственный вариант.
Записан
SABROG
Гость
« Ответ #43 : Август 14, 2009, 15:18 »

Не будет. processEvents() не обрабатывает deffered deletion. Должен быть полный возврат в основной цикл событий. Отдельно выделенный QEventLoop также не удаляет объекты. Удаление происходит только в том цикле событий в котором был вызвал deleteLater().
Если и так. То другой вариант, вторично вызвать Obj->deleteLater(); по таймеру. Улыбающийся Тут уж точно глюкнет. И это не единственный вариант.

Понятно, что глюканет, тут речь о другой ситуации - многопоточности.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #44 : Август 17, 2009, 19:14 »

насколько правильно я освобождаю память??
А класс class Roszdrav в свою очередь вызывается в другом классе

1) Почему бы просто не написать

LS theL(this);

Т.е. просто локальная переменная вместо указателя. Деструктор вызовется автоматически при выходе из функции.

2) Если деструктор все-таки нужен - его объявление  должно быть virtual.

Edit: пардон, не увидел страниц 2 и 3  Улыбающийся Ответил что уже отвечено
« Последнее редактирование: Август 17, 2009, 19:21 от Igors » Записан
Страниц: 1 2 [3] 4   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.104 секунд. Запросов: 22.