首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QSharedPointer和QObject::

QSharedPointer和QObject::
EN

Stack Overflow用户
提问于 2012-09-27 14:28:07
回答 2查看 6.6K关注 0票数 9

我遇到了一种情况,即QSharedPointer托管对象表示它已经完成了它的用途,并且可以很快删除(在执行之后,函数会发出readyForDeletion信号)。在使用普通指针时,我只需调用对象上的QObject::deleteLater,但是这在QSharedPointer-managed实例中是不可能的。我的解决办法如下:

代码语言:javascript
复制
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等等)有很多开销。是否有更好的解决办法来处理这种情况?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-27 14:44:04

您可以将QSharedPointer 构造函数Deleter一起使用:

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

代码语言:javascript
复制
 QSharedPointer<MyObject> obj =
         QSharedPointer<MyObject>(new MyObject, &QObject::deleteLater);
票数 21
EN

Stack Overflow用户

发布于 2018-03-16 00:37:19

另一种选择是使用QPointer而不是QSharedPointer,引用文档:

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12623690

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档