specialized std::default_delete with QQmlComponent
specialized std::default_delete with QQmlComponent
我正在尝试"专门化"QQmlComponent的std::d efault_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) {
///...
};
}
在我的实用程序中.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
专业化没有被调用,但我可以为你提供一个替代方案 - 你可以提供一个自定义删除器来代替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版本作为注释。
相关文章:
- Problems with std::cin.fail()
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- 这对"With a stackless coroutine, only the top-level routine may be suspended."意味着什么
- Boost.TEST with CLion: "Test framework quit unexpectedly"
- 避免碎片化的ClientHellos with OpenSSL (DTLS)
- Issues with Win32 ReadProcessMemory API
- Qt with WinAPI MouseProc
- [[maybe_unused]] with structured_binding?
- Issue with WriteProcessMemory
- OpenCV RTP-Stream with FFMPEG
- "Unable to start debugging. No process is associated with this object." - 在Visual Studio Code中使用GDB
- std::adjacent_difference with std::chrono time_point
- DLL Made with CMake 使程序崩溃
- QtCreator with C 库中的链接器问题
- SHBrowseForFolder with BIF_BROWSEFORCOMPUTER and SHGetPathFr
- specialized std::default_delete with QQmlComponent
- VS2019 - Sudo Remote Debugging on Linux with Cmake project
- Inference pytorch C++ with alexnet and cv::imread image
- Pybind11: init<> with lambda
- Incomings Call with Android Sip stack in Embarcadero C++ bui