PavelK
@PavelK

Умные указатели, создание в цикле или что использовать вместо них?

Приветствую!
В общем предыстория:
В отдельном потоке в цикле создаю класс, генерирую сигнал (Qt emit ....), в параметрах сигнала указатель на этот класс,
на этот сигнал подписаны несколько слотов в нескольких разных потоках.
Что бы не освобождать потом ресурсы вручную (после того, как все слоты отработают) решил использовать умные указатели.
В данный момент QSharedPointer.
После перехода появился неимоверно трудно уловимый баг, а именно выжирание памяти (если перейти обратно, то всё ок).
Причём может день нормально отработать, а потом начать подъедать оперативку.

Когда-то давно, то ли в доках, то ли на форумах слышал упоминание, что умные указатели не стоит использовать в циклах.
Чисто теоретически, почему и так ли это?

Если это так, то как тогда лучше освободить ресурсы, если заранее не известно сколько слотов будут подписаны на сигнал и темболее кто из слотов подпишется последним (что бы в нём освободить)?
  • Вопрос задан
  • 139 просмотров
Пригласить эксперта
Ответы на вопрос 1
vt4a2h
@vt4a2h
Senior software engineer (C++/Qt/boost)
Когда-то давно, то ли в доках, то ли на форумах слышал упоминание, что умные указатели не стоит использовать в циклах.
Чисто теоретически, почему и так ли это?

Не вижу никаких преград для использования в циклах.

Если это так, то как тогда лучше освободить ресурсы, если заранее не известно сколько слотов будут подписаны на сигнал и тем более кто из слотов подпишется последним (что бы в нём освободить)?

SharedPointer должен сам освобождать ресурсы, когда счётчик ссылок упадёт до нуля. Вы не должны это контролировать в обычном случае (а если надо, но тогда уже используйте интрузивные указатели).
Проверьте, нет ли циклических ссылок. Погоняйте программу с анализаторами памяти, Valgrind, например.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы