首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用QQmlComponent的专用std::default_delete

使用QQmlComponent的专用std::default_delete
EN

Stack Overflow用户
提问于 2018-10-01 23:22:33
回答 1查看 91关注 0票数 0

我试图“专门化”QQmlComponent的std::default_delete,但没有成功,我的实现从未被调用过,只调用了::std中的默认deleter。因此,出于调试目的,我为QObject创建了另一个专门化,这个专用化称为:

在我的util.h中,我有:

代码语言:javascript
复制
namespace std {
    // QQmlComponent often theses objects
    // are owned by another thread despite their QQmlEngine::CppOwnership, using delete operator
    // directly generate crashes, specify a default_delete specifically for QQmlComponent to
    // use a deleteLater() call over a raw delete

    template<>
    struct  default_delete<QQmlComponent> {
        void operator()(QQmlComponent* ptr) {
            if ( ptr &&
                 QQmlEngine::objectOwnership(ptr) == QQmlEngine::CppOwnership )
                ptr->deleteLater();
        }
    };


    template<>
    struct  default_delete<QObject> {
        void operator()(QObject* ptr) {
           ///...
    };


   }

在我的utils.cpp中,我有:

代码语言:javascript
复制
std::unique_ptr<QObject> testQObject= std::make_unique<QObject>(new QObject());

std::unique_ptr<QQmlComponent> connectorComponent = std::make_unique<QQmlComponent>(engine, QStringLiteral("qrc:/QuickQanava/VisualConnector.qml"));

testQObject中调用专门化的default_delete,而不是在connectorComponent

我不明白我做错了什么。作为附注,此代码是在共享库中实现的

EN

回答 1

Stack Overflow用户

发布于 2018-10-02 03:40:41

我不知道为什么您的default_delete专门化没有被调用,但我可以为您提供一个替代方案-您可以为std::unique_ptr提供一个custom deleter,并以这种方式解决您的问题。

您可以这样做(如果您不能或不想使用lambda,则不必使用lambda):

代码语言:javascript
复制
using SmartComponentPtr = std::unique_ptr <QQmlComponent, void (*) (QQmlComponent *)>;

inline SmartComponentPtr MakeSmartComponentPtr (QQmlComponent *component)
{
    return SmartComponentPtr (component, [] (auto component) { /* do funky stuff to delete component here */ } );
};

QQmlComponent *MyComponentPointer = ...
SmartComponentPtr smart_component_pointer = MakeSmartComponentPtr (MyComponentPointer);
// ...

一个shared_ptr也可以有一个自定义的deleter,尽管这样做的成本更高。

我在Wandbox上创建了一个简单的实时演示,其中还包含了非lambda版本作为注释。

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

https://stackoverflow.com/questions/52594239

复制
相关文章

相似问题

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