我正在开发一个在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
。