QSharedPointer и QObject :: deleteLater

У меня есть ситуация, когда 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 и так далее). Есть ли лучшее решение для таких ситуаций?

4

Решение

Вы можете использовать QSharedPointer конструктор с Deleter :

Параметр delete определяет пользовательское удаление для этого объекта.
Пользовательский удалитель вызывается вместо оператора delete (), когда
количество сильных ссылок падает до 0. Это полезно, например,
для вызова deleteLater () вместо QObject:

 QSharedPointer<MyObject> obj =
QSharedPointer<MyObject>(new MyObject, &QObject::deleteLater);
13

Другие решения

Альтернатива использует QPointer вместо QSharedPointer, со ссылкой на документацию:

Класс QPointer — это шаблонный класс, который предоставляет защищенные указатели на QObject.

Защищенный указатель, QPointer, ведет себя как обычный указатель C ++ T *, за исключением того, что он автоматически устанавливается на 0, когда ссылочный объект уничтожается (в отличие от обычных указателей C ++, которые в таких случаях становятся «висячими указателями»). T должен быть подклассом QObject.

0

По вопросам рекламы [email protected]