tsarevfs
@tsarevfs
C++ developer

Как работает сборка мусора в Qt?

Насколько можно полагаться на сборщик мусора Qt? В частности, интересует вариант, когда некоторый класс возвращает сырые указатели. Например:
QNetworkReply * reply = networkAccessManager_->post(request, params.encodedQuery());

В документации сказано:
QNetworkAccessManager::~QNetworkAccessManager() Destroys the QNetworkAccessManager object and frees up any resources. Note that QNetworkReply objects that are returned from this class have this object set as their parents, which means that they will be deleted along with it if you don't call QObject::setParent() on them.

Замечательно, при вызове деструктора все порожденные им ресурсы, в том числе QNetworkReply будут удалены. Но если manager будет жить достаточно долго получается все созданные им QNetworkReply будут висеть в памяти? По крайней мере не очень понятно как бы он смог этого избежать.
  • Вопрос задан
  • 4289 просмотров
Решения вопроса 3
gbg
@gbg Куратор тега C++
Любые ответы на любые вопросы
Сборка работает по иерархической модели - породивший объекты класс при своем удалении уничтожает потомков (посылая им сигнал).

Хотите улучшить - удаляйте сами, ничего страшного не случится.
Ответ написан
maaGames
@maaGames
Погроммирую программы
if you don't call QObject::setParent() on them.

Задай другой родительский объект и они удалятся вместе с родителем.
Ответ написан
Комментировать
voidnugget
@voidnugget
Программист-прагматик
Это не сборка мусора, а подсчёт ссылок в иерархиях объектов и ручное освобождение памяти иерархий.
В сборщиках мусора это реализовано автоматически, и сама сборка мусора с подсчётом ссылок происходит не в самые подходящие моменты - мусора либо слишком мало, либо слишком много.

Согласен с maagames.ru - можно задать просто другой родительский объект, и удалять его, вместе со всеми ответами/запросами, по требованию.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы