У меня есть ситуация, когда QSharedPointer
Управляемый объект сигнализирует о том, что он выполнил свою задачу и вскоре будет готов к удалению (после выполнения функция покидала мой readyForDeletion
сигнал). При работе с нормальный указатели, я бы просто позвонил QObject::deleteLater
на объекте, однако это невозможно с QSharedPointer
управляемый экземпляр. Мой обходной путь следующий:
template<typename T>
class QSharedPointerContainer : public QObject
{
QSharedPointer<T> m_pSharedObj;
public:
QSharedPointerContainer(QSharedPointer<T> pSharedObj)
: m_pSharedObj(pSharedObj)
{} // ==> ctor
}; // ==> QSharedPointerContainer
template<typename T>
void deleteSharedPointerLater(QSharedPointer<T> pSharedObj)
{
(new QSharedPointerContainer<T>(pSharedObj))->deleteLater();
} // ==> deleteSharedPointerLater
Это хорошо работает, однако использование этого метода требует много времени (выделение нового QObject
и так далее). Есть ли лучшее решение для таких ситуаций?
Вы можете использовать QSharedPointer
конструктор с Deleter
:
Параметр delete определяет пользовательское удаление для этого объекта.
Пользовательский удалитель вызывается вместо оператора delete (), когда
количество сильных ссылок падает до 0. Это полезно, например,
для вызова deleteLater () вместо QObject:
QSharedPointer<MyObject> obj =
QSharedPointer<MyObject>(new MyObject, &QObject::deleteLater);
Альтернатива использует QPointer вместо QSharedPointer, со ссылкой на документацию:
Класс QPointer — это шаблонный класс, который предоставляет защищенные указатели на QObject.
Защищенный указатель, QPointer, ведет себя как обычный указатель C ++ T *, за исключением того, что он автоматически устанавливается на 0, когда ссылочный объект уничтожается (в отличие от обычных указателей C ++, которые в таких случаях становятся «висячими указателями»). T должен быть подклассом QObject.