gpt4 book ai didi

c++ - 使用 QQmlComponent 专门化 std::default_delete

转载 作者:行者123 更新时间:2023-11-28 04:32:10 24 4
gpt4 key购买 nike

我正在尝试“专门化”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 中调用

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

最佳答案

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

您可以这样做(如果您不能或不想使用 lambda,则不必使用 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);
// ...

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

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

关于c++ - 使用 QQmlComponent 专门化 std::default_delete,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52594239/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com