删除QSGNode时,QtThread出现SIGSEGV错误

时间:2017-09-10 12:38:10

标签: android c++ qt qthread sigsegv

我正在开发一款在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是否正在使用&退出?

1 个答案:

答案 0 :(得分:0)

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

实现可能会在节点变得无用时将其删除。然后,在nullptr的下次调用中,oldNodeupdatePaintNode()传递给class_mem_node

不要存储oldNode,请使用$options['joins'] = array( array( 'table' => 'cities', 'alias' => 'City', 'type' => 'INNER', 'conditions' => [ 'Building.city_id = City.id' ] ), );