带有QQmlComponent的专用std :: default_delete

时间:2018-10-01 15:22:33

标签: c++ qt std

我试图“专门化” QQmlComponent的std :: default_delete失败,我的实现从未被调用,仅调用:: std中的默认删除器。因此,出于调试目的,我为QObject创建了另一种专门化,称为:

在我的util.h中,我有:

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中,我有:

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

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

1 个答案:

答案 0 :(得分:1)

我不知道为什么没有调用您的I'm rolling the dice with 9 sides ELEVEN TIMES [9, 4, 5, 2, 8, 7, 3, 8, 2, 1, 4] 专长,但我可以为您提供替代方案-您可以向default_delete提供custom deleter并解决您的问题方式。

您可以这样操作(如果您不愿意也不必使用lambda):

std::unique_ptr

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); // ... 也可以有一个自定义删除器,尽管这样做成本更高。

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