специализированный std :: default_delete с QQmlComponent - PullRequest
0 голосов
/ 01 октября 2018

Я пытаюсь «специализировать» std :: default_delete для QQmlComponent без успеха, моя реализация никогда не вызывается, вызывается только удаление по умолчанию из :: 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

Я не понимаю, что я делаю неправильно.Как примечание, этот код реализован в общей библиотеке

1 Ответ

0 голосов
/ 01 октября 2018

Я не знаю, почему не вызывается ваша default_delete специализация, но я могу предложить вам альтернативу - вы можете вместо этого поставить пользовательское средство удаления на 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);
// ...

A shared_ptr также можетУ меня есть пользовательское средство удаления, хотя это стоит больше.

Я создал простую живую демонстрацию на Wandbox , которая также включает не-лямбда-версию в качестве комментариев.

...