我试图“专门化”QQmlComponent的std::default_delete,但没有成功,我的实现从未被调用过,只调用了::std中的默认deleter。因此,出于调试目的,我为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中
我不明白我做错了什么。作为附注,此代码是在共享库中实现的
发布于 2018-10-02 03:40:41
我不知道为什么您的default_delete专门化没有被调用,但我可以为您提供一个替代方案-您可以为std::unique_ptr提供一个custom deleter,并以这种方式解决您的问题。
您可以这样做(如果您不能或不想使用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也可以有一个自定义的deleter,尽管这样做的成本更高。
我在Wandbox上创建了一个简单的实时演示,其中还包含了非lambda版本作为注释。
https://stackoverflow.com/questions/52594239
复制相似问题