【发布时间】:2016-12-08 17:31:49
【问题描述】:
我最近在我的 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 自定义小部件 - 没有问题),然后是基类。
【问题讨论】:
标签: c++ qt destructor gesture-recognition