删除 QSGNode 时 QtThread 的 SIGSEGV 错误

SIGSEGV error with QtThread on deleting QSGNode

本文关键字:SIGSEGV 错误 QtThread QSGNode 删除      更新时间:2023-10-16

我正在开发一个在Android和iOS上运行的Qt应用程序。

场景:在指针上调用删除会导致我的应用程序崩溃有时会在 Android 上给我以下错误。

Fatal signal 11 (SIGSEGV), code 1, fault addr 0x3c in tid 7134 (QtThread)

这是由于我的QQuickItem派生类updatePaintNode中的删除调用引起的。

// My updatePaintNode logic relevant to this question
QSGNode * MyQQuickItem::updatePaintNode(QSGNode * oldNode, UpdatePaintNodeData * updatePaintNodeData) {
Q_UNUSED(oldNode)
Q_UNUSED(updatePaintNodeData)
if(class_mem_node != Q_NULLPTR) {
delete class_mem_node;    // this is where the crash occurs
}
class_mem_node = new QSGNode;
// Execute drawing logic
return class_mem_node;
}

问题:
我的应用程序的另一个窗口依赖于要执行MyQQuickItem::updatePaintNode,但有时在 Android 上,对delete class_mem_node的调用会导致崩溃并出现Fatal signal错误。有趣的是,这个问题只发生在安卓上,而不是在iOS或OSX上。

问:
我在updatePaintNode的逻辑有什么问题?这是线程同步问题吗?

有什么方法可以检查QSGNode是否正在使用并返回?

当你return class_mem_node;时,你不再拥有class_mem_node的所有权。

当节点变得无用时,实现可能会删除该节点。然后,它会在下次调用updatePaintNode()oldNode传递nullptr

不要存储class_mem_node,使用oldNode