我最近在Qt 5.7应用程序中遇到了exit code 255
。在添加我的自定义QGestureRecognizer
之后,就发生了这种情况。我调试了Qt的源代码,得出的结论是QGestureManager
自动处理所有QGestureRecognizer
实例。导致该问题的行位于创建和注册识别器的小部件的析构函数中:
Demo::~Demo() {
// delete other stuff
delete recognizer;
}
问题是
QGestureRecognizer
不支持(至少根据文档并查看构造函数的签名)Qt中的parent-child
关系,因为它不是从QObject
(或该基本Qt类的任何子类)派生的。这意味着不能将parent
分配给其构造函数,因此QCustomGestureRecognizer recognizer = new QCustomGestureRecognizer (this)
是不可能的。继续这种思路,这意味着必须通过调用delete recognizer
手动触发析构函数。或者我以为...在应用程序生命周期结束时,将调用
QGestureManager
。在其中有一个称为m_recognizers
的识别器列表。它包含一堆内置识别器(例如用于Tap
手势的识别器)以及已注册的自定义识别器(在我的情况下,它已注册为257
)。 QGestureManager
的析构函数遍历列表并删除其条目。当
delete recognizer
行出现时,当qDeleteAll(...)
(对于m_recognizers
)到达自定义识别器的条目时,由于它试图删除已删除的内容,因此出现了分段错误。在我将小部件的析构函数中的
delete recognizer
行注释掉之后,我不再面临该问题,但是我仍然不确定是否没有在某个地方破坏我的代码。退出代码不是(按预期)0
,但是正式文档中完全没有有关识别器处理方式的信息。有没有人遇到这个问题?我并没有排除问题可能来自代码的其他部分,尽管考虑到在调用默认
QWidget
析构函数时会出现的可能性似乎很小。根据C ++标准,当继承类时,首先调用子类的析构函数(在我的情况下,这是Demo
定制小部件-在那里没有问题),然后是基类。 最佳答案
如果您使用
Qt::GestureType QGestureRecognizer::registerRecognizer(QGestureRecognizer *recognizer)
系统确实拥有该对象的所有权,因此您不应该自己删除它。
文档摘录:
该应用获取识别器的所有权并返回
与之关联的手势类型ID。
关于c++ - QGestureManager自动销毁QGestureRecognizer吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38736059/