0

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

在我的 util.hi 中有:

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

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

4

1 回答 1

1

我不知道为什么default_delete不调用您的专业,但我可以为您提供替代方案 - 您可以提供自定义删除器std::unique_ptr代替并以这种方式解决您的问题。

你这样做(如果你不能或不想使用,你不必使用 lambda):

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);
// ...

Ashared_ptr也可以有一个自定义删除器,尽管这会花费更多。

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

于 2018-10-01T19:40:41.257 回答