9

我有一种情况,一个QSharedPointer托管对象表示它已经完成了它的目的并准备好很快删除(在执行后离开函数发出我的readyForDeletion信号)。使用普通指针时,我只调用对象,但是使用-managed 实例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

2 回答 2

21

您可以将QSharedPointer 构造函数Deleter

deleter 参数指定此对象的自定义删除器。当强引用计数下降到 0 时,将调用自定义删除器,而不是运算符 delete()。例如,这对于在 QObject 上调用 deleteLater() 很有用:

 QSharedPointer<MyObject> obj =
         QSharedPointer<MyObject>(new MyObject, &QObject::deleteLater);
于 2012-09-27T14:44:04.500 回答
1

另一种方法是使用QPointer而不是QSharedPointer,引用文档:

QPointer 类是一个模板类,它提供指向 QObject 的受保护指针。

受保护的指针 QPointer 的行为类似于普通的 C++ 指针 T *,只是它在被引用的对象被销毁时自动设置为 0(与普通的 C++ 指针不同,在这种情况下会变成“悬空指针”)。T 必须是 QObject 的子类。

于 2018-03-16T00:37:19.767 回答