删除 QSGNode 时 QtThread 的 SIGSEGV 错误
SIGSEGV error with QtThread on deleting QSGNode
我正在开发一个在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
。
相关文章:
- 为什么我的递归代码给出 sigsegv 错误?
- 哪个部分导致"SIGSEGV"错误以及如何修复它?
- 声明数组时出现 SIGSEGV 错误,而不创建新的 int[size]
- 使用队列<结构时出现 SIGSEGV 错误 *>
- 如何解决非常大的阵列输入的SIGSEGV错误
- C++ SDL 中的 SIGSEGV 错误
- 删除 QSGNode 时 QtThread 的 SIGSEGV 错误
- SIGSEGV 错误详细信息和删除步骤
- 返回0后,程序会收到sigsegv错误
- 信号名称:SIGSEGV 错误
- 在某个范围内查找素数时出现 Sigsegv 错误
- 代码中奇怪的SIGSEGV错误
- 以下代码中存在运行时-sigsegv错误
- SPOJ上简单动态编程中的SIGSEGV错误
- 本机Android应用程序中出现SIGSEGV错误
- 在带有openGL和SDL的linux上使用c++时发生SIGSEGV错误
- 在链表中插入时发生SIGSEGV错误
- SIGSEGV错误(运行时错误)
- 上传输入时出现SIGSEGV错误
- 在使用malloc的数组中出现SIGSEGV错误