QSharedPointer和QObject :: deleteLater

时间:2012-09-27 14:28:08

标签: c++ qt shared-ptr qobject qsharedpointer

我遇到这样一种情况: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等等)。有没有更好的解决方案来处理这种情况?

2 个答案:

答案 0 :(得分:15)

您可以将QSharedPointer constructorDeleter

一起使用
  

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

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

答案 1 :(得分:0)

另一种方法是使用QPointer代替QSharedPointer,引用文档:

  

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

     

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