我正在开发一款在Android和Android上运行的Qt应用程序的iOS。
情境: 在指针上调用delete会导致我的应用程序崩溃,有时会在Android上出现以下错误。
Fatal signal 11 (SIGSEGV), code 1, fault addr 0x3c in tid 7134 (QtThread)
这是由于我的updatePaintNode
派生类的QQuickItem
中的删除调用造成的。
// 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
错误导致崩溃。有趣的是,问题只发生在Android 上,而不是发生在iOS或OSX上。
问题:
我在updatePaintNode
中的逻辑有什么问题?这是线程同步问题吗?
我是否可以通过某种方式检查QSGNode
是否正在使用&退出?
答案 0 :(得分:0)
当您return class_mem_node;
时,您不再拥有class_mem_node
的所有权。
实现可能会在节点变得无用时将其删除。然后,在nullptr
的下次调用中,oldNode
将updatePaintNode()
传递给class_mem_node
。
不要存储oldNode
,请使用$options['joins'] = array(
array(
'table' => 'cities',
'alias' => 'City',
'type' => 'INNER',
'conditions' => [
'Building.city_id = City.id'
]
),
);
。