Деструктор Qt C ++ долго возвращался - PullRequest
5 голосов
/ 24 августа 2010

Я работаю над довольно стандартным мобильным приложением Qt (написанным на C ++ и предназначенным для устройств на Symbian), и обнаруживаю, что иногда, когда приложение закрывается (например, через вызов QApplication :: quit), последний деструкторв приложении может занять много времени, чтобы вернуться (30 секунд плюс).Под этим я подразумеваю, что все операции очистки в деструкторе завершены (быстро, все хорошо в течение секунды), и мы достигли точки, когда выполнение покидает деструктор и возвращается к коду, который неявно вызывал его (т.е. когда мы удаляемобъект).

Очевидно, что в этот момент я ожидаю, что выполнение вернется сразу после вызова, чтобы удалить объект, практически мгновенно, но, как я говорю, иногда это занимает много времени!

Это длительное время закрытия происходит как в отладочной, так и в выпускной сборках, с включенным или отключенным ведением журналов, поэтому я не думаю, что это здесь фактор.Когда мы дойдем до конца деструктора, я почти уверен, что ни один файловый дескриптор не останется открытым или какие-либо другие открытые ресурсы (сетевые подключения и т. Д.) ... хотя, даже если они, конечно, это не будет представлять собой проблему навыход из деструктора (?).

Это при удалении объекта приложения QMainWindow.В настоящее время вызов для этого находится в слоте, подключенном к QApplication :: aboutToQuit, хотя я также пытался удалить этот объект в «основной» функции приложения.

Длительность задержки, которую мы испытываем, кажется пропорциональнойколичество активности в приложении, прежде чем мы выйдем.Это заставляет меня думать, что утечки памяти могут быть проблемой здесь, однако мы не знаем ни о чем (не значит, что не , конечно), а также я никогда не видел этогоповедение раньше с утечкой памяти.

Кто-нибудь есть идеи, что здесь может происходить?

Приветствия

1 Ответ

4 голосов
/ 24 августа 2010

Если ваш последний деструктор предназначен для класса, который наследует QObject, то деструктор QObject будет вызываться сразу после деструктора вашего конечного объекта.Предположительно этот объект является корнем возможно большого дерева объектов, которое вызовет ряд действий, в том числе вызов деструктора всех дочерних объектов QObject.Поскольку вы утверждаете, что проблема связана с объемом активности, вероятно, в дерево объектов добавлено очень большое количество дочерних элементов, которые удаляются в это время, возможно, больше, чем вы предполагали.Вместо того, чтобы добавлять все объекты в одно гигантское дерево, нужно удалить все сразу.Определите объекты, которые создаются часто, которые не должны сохраняться в течение всего выполнения.Вместо создания этих объектов с родителем, создайте новое дерево, которое можно удалить ранее (parent = 0).Посмотрите на QObject :: deleteLater (), который будет ждать, пока не будет никакого взаимодействия с пользователем, чтобы удалить объекты в этих независимых деревьях.

...