2015-12-27 2 views
1

Я построил приложение, используя Qt. Он включает в себя некоторые экраны, а некоторые из них распределяются динамически. Я думаю, будет ли delete динамически выделенных объектов на onBackButton() или просто в деструкторах их создателей.Вызов деструктора на кнопку «Назад» или при закрытии приложения?

Вот вещь:

Если они удалены в onBackButton(), это сохранит память, потому что, пока экран не отображается, не будет использоваться память. Но это означает, что если мы закрываем приложение, пока мы находимся на одном из этих экранов, память не будет освобождена.

С другой стороны, если мы удалим их по деструкторам их создателей, память будет освобождена, когда приложение будет существовать. Но память по-прежнему будет использоваться, даже если мы не на этом экране (если мы войдем в такой экран, а затем отжали назад, память все равно будет использоваться).

И, конечно же, мы не можем delete в обоих местах. Это вызовет исключения.

Я пошел с первым вариантом, потому что единственный способ «закрыть (существовать)» - это приложение, физически нажатие кнопки питания на устройстве, - которое отключит устройство. Так что никакого вреда не было - в следующий раз, когда мы включим устройство, все будет хорошо.

Является ли мой подход правильным или есть что-то лучшее, что я могу сделать?

ответ

1

Для QObject (и подклассов) вы, вероятно, должны использовать (то есть вызывать) слот deleteLater.

Объект будет удален, когда управление возвращается в цикл обработки событий

+1

Я думаю, он говорит о том, где можно вызвать функцию delete или deleteLater(). Поэтому не имеет значения, как он удаляет объект. Поскольку следующий раз, скорее всего, произойдет после цикла текущего события. –

3

Ну, если ваше приложение является единственным запущенным на этом устройстве, а затем, как вы упомянули, о применении закрыть устройство отключит вниз, поэтому никаких проблем.

Но, как лучше, я думаю, вы можете использовать систему очистки памяти Qt. Это работает так, что любой экземпляр QObject удалит все его дочерние QObjects при его собственном делеции. Таким образом, вам просто нужно настроить родительский компонент ваших окон и установить вершину этой родительской иерархии экземпляр QApp. Таким образом, при применении вполне каждый из них будет уничтожен должным образом.

Кроме того, вы можете, конечно, удалить объект в нескольких местах, если вы указали указатель на nullptr, чтобы следующее удаление не вызывало каких-либо исключений.

Но лучший подход мог бы использовать QPointer, чтобы удерживать указатель, тогда он будет иметь значение null при удалении объекта.

Другим подходом может быть использование нового C++ 11 std::shared_ptr, но вы должны опубликовать код, чтобы лучше иллюстрировать вашу ситуацию.

Смежные вопросы