我最近在Qt 5.7应用程序中遇到过exit code 255
。这是在我添加自定义QGestureRecognizer
之后发生的。我调试了Qt的源代码,我得出的结论是QGestureManager
会自动处理所有QGestureRecognizer
个实例。导致问题的行在widget的析构函数内部,其中创建并注册了识别器:
Demo::~Demo() {
// delete other stuff
delete recognizer;
}
事情是QGestureRecognizer
不支持(至少根据文档和查看构造函数的签名)Qt中的parent-child
关系,因为它不是从QObject
派生的({1}}或该基础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
自定义小部件 - 没有问题),然后是基类。