Russian Qt Forum

Qt => Общие вопросы => Тема начата: Rain от Февраль 19, 2009, 23:52



Название: Неявное удаление объкта
Отправлено: Rain от Февраль 19, 2009, 23:52
Цитировать
QObjects organize themselves in object trees. When you create a QObject with another object as parent, the object will automatically add itself to the parent's children() list. The parent takes ownership of the object i.e. it will automatically delete its children in its destructor.
Какой-то внутренний конфликт возникает при чтении этих строк.

Есть у меня в классе набор указателей на "обычные" объекты и набор указателей на потомков QObject. Нужно заботится об удалении "обычных" в деструкторах, или же каждого использовать в контексте смарт-поинтера. С другой стороны, с указателями на QObject-ы получается обратная ситуация, нужно следить чтобы никто из них случайно не попал в деструктор и не удалился неположенным образом(оно может быть вреда и не будет, внутрях всеравно наверняка используются QPointer'ы, но зачем на лишние действия?).

Не лучше ли было сделать нормальный QSmartPointer какой-нибудь и не городить огород с неявным удалением чайлдов?




Название: Re: Неявное удаление объкта
Отправлено: Dendy от Февраль 20, 2009, 00:22
Естественно нужно следить, чтобы не удалился один раз из деструктора родителя, а второй раз отукда-то ещё. Точно так же, как следить за тем, чтобы не удалить простой указатель несколько раз. Случайностей не бывает, логика достаточно чёткая. У обьекта может быть один и только один родитель, который автоматически удалит его в собственном деструкторе. Если обьект удалится раньше по другой причине - он уберётся из списка дочерних обьектов и деструтор второй раз вызван не будет. Другими словами - можете спокойно удалять детей в деструкторе, более того иногда это необходимо, чтобы вызвать цепочку деструкторов в нужной последовательности, а не в случайном порядке, как это сделает ~QObject().

QPointer не удаляет обьекты. Этот класс нужен только для "хаков", программировать им не стоит - рискуете сломать процедурный стиль программирования, а, следовательно, запутать логику программы.

Цитировать
Не лучше ли было сделать нормальный QSmartPointer какой-нибудь и не городить огород с неявным удалением чайлдов?

Для этого нужно хранить экземпляры QSmartPointer в классе, что не всегда возможно. Хотя бы потому что обьекты могут "клеиться" к другим обьектам на лету.


Название: Re: Неявное удаление объкта
Отправлено: Rain от Февраль 20, 2009, 00:43
более того иногда это необходимо, чтобы вызвать цепочку деструкторов в нужной последовательности, а не в случайном порядке, как это сделает ~QObject().
Это все так. Но как-то много получается возможных точек выхода. Если например придется работать со старым(да еще и чужим) кодом, то попробуй разбери где, что, как, зачем и когда удаляется.


QPointer не удаляет обьекты.
Да, это я уже уяснил, спасибо.

Цитировать
Не лучше ли было сделать нормальный QSmartPointer какой-нибудь и не городить огород с неявным удалением чайлдов?
Для этого нужно хранить экземпляры QSmartPointer в классе, что не всегда возможно. Хотя бы потому что обьекты могут "клеиться" к другим обьектам на лету.

Фраза "на лету" сильно не в стиле С++ на мой взгляд:-) Я бы в предпочел инкапсулировать в объекте некоторые данные и реализовать соответствующую функциональность, чем лепить что-то из вне. В случае С++ :-)


Название: Re: Неявное удаление объкта
Отправлено: Dendy от Февраль 20, 2009, 01:16
Если честно не знаю чем вас смутил C++, это всего лишь инструмент. Как видите - с помощью него можно достаточно просто создать обьектную модель, из которой на лету можно конструировать гирлянду обьектов. Инкапсуляция - это хорошо, но иногда вы получаете уже готовый экземпляр обьекта, к которому нужно что-то приклеить сбоку. Например, переопределить некоторые события, приклеив обьект с фильтром событий, который уничтожится вместе с хозяином.