使用qt5.6.3的注意事项:

1 当SQL模型(如QSqlTableModel)使用一个无效的索引时,应用程序有可能崩溃。

无效索引的原因有:1. 索引列包含NULL值:如果索引中的某列允许NULL,而查询使用此列进行过滤但未考虑NULL值,则索引变得无效。2. 索引失效:索引列的数据发生变化,但索引未及时更新,导致索引与数据不一致,变为无效索引。3. 索引列发生更改:如果对索引列使用UPDATE语句进行更新,但索引未及时更新,索引也会变为无效。4. 手动删除索引:如果在模型构建索引后,开发者手动删除了该索引,那么模型中仍然存在指向已删除索引的引用,变成无效索引。当使用这样的无效索引进行过滤或排序时,Qt 5.6.3有可能出现崩溃的情况。解决方法是:1. 检查无效索引的原因,进行修复。比如更新 NULL 值,重建索引等。2. 在进行过滤或排序前,先确认索引是否有效。如果无效,则不使用该索引。3. 使用try/catch块包围过滤和排序代码,并在catch块中对无效索引进行检查, adopt非索引方式进行操作,避免崩溃

代码示例:

cpp

try {

    model->setFilter("invalidIndexColumn = 1");  // 使用无效索引进行过滤

    model->sort(invalidIndexColumn);  // 使用无效索引进行排序

} catch (const std::exception &e) {

    qDebug() << e.what();

    // 检查索引是否无效,如果无效则不使用索引

    model->setFilter("invalidIndexColumn = 1", QSqlTableModel::NotIncludedInFilter);  

    model->sort(invalidIndexColumn, Qt::DescendingOrder);

}

所以,在使用Qt 5.6.3的SQL模型时,要特别留意索引的有效性,并在必要时采取措施防止无效索引导致的崩溃问题发生。

2控件渲染:一些Qt 5.6.3控件的渲染机制比较低效,特别是在含大量控件的窗口中,界面操作会比较卡顿,如拖动、滚动等。

3 Model类:Qt 5.6.3的一些Model类,如QAbstractItemModel的虚函数中,要求子类释放返回的指针,但实际上部分子类并未正确释放,导致内存泄露。

4 QPointers与QSharedPointers: Qt 5.6.3对这两个智能指针类的实现较简单,在一些复杂场景下未能很好发挥作用,导致资源无法正确管理,出现内存泄露。

主要原因是:1. 循环引用:当两个或多个QObject彼此通过QPointers或QSharedPointers引用时,由于Qt 5.6.3的实现机制,这些QObject无法正确释放,出现循环引用导致的内存泄露。2. 生命周期管理:这两个智能指针管理的对象生命周期较难掌握,如果在对象销毁后仍然存在对该对象的引用,那么其资源无法释放,产生内存泄露。 3. 捕获列表问题:当使用lambda表达式或闭包将这两个智能指针作为捕获变量时,其生命周期会延长,可能导致所指对象无法及时释放,出现内存泄露。 4. QObject子类:当使用这两个智能指针管理QObject的子类对象时,其释放方式较难确定,如果未能正确实现子类的释放机制,则很容易出现内存泄露。修复这些内存泄露问题的方法主要有:1. 升级到Qt 5.12及以上版本。新版本对这两个智能指针的实现进行了改进,可以更好地解决循环引用与生命周期管理问题,减少内存泄露的可能。2. 采用其他第三方的智能指针替代。例如std::shared_ptr,其实现机制更加成熟,可以解决Qt版本较低时的内存泄露问题。 3. 手动管理QObject的内存。在必要时调用delete释放QObject对象,而非依赖智能指针。这需要对各种场景下对象生命周期有清晰的认识。4. 避免将这两个智能指针的对象当作lambda表达式或闭包的捕获变量。在必要时手动扩展其生命周期。5. 重写或重新实现QObject子类的释放机制。确保其可以在Pointers或SharedPointers释放时正确释放资源。

QDBUS

  5.6.3对应的版本1.10.6

  1. Bus 1.10.6版本虽然总体比较稳定,但还是存在一些已知问题:

1. DBusMenu在某些情况下可能会崩溃。DBusMenu是D-Bus用于菜单和状态的协议,在某些 Corner Case下会出现崩溃,已在更高版本中修复。

2. 日志文件可能会快速增长到超过1GB。D-Bus的日志文件dbus.log在debug模式下,日志级别设置为2-4时,日志文件会快速增长到超过1GB,导致磁盘空间不足,已在1.12.2版本中修复。

3. 服务重启后,D-Bus会暂时失去名称直到下一次请求。这是一个较小的问题,并不会真正影响服务,但仍然存在,已在1.12版本中修复。

4 dbus-daemon在处理SIGHUP信号时可能会死锁。dbus-daemon进程在重新加载配置文件时,有时候会出现死锁的情况,需要重启D-Bus,已在1.12.

  1. 4版本中修复。

5. libdbus在并发情况下偶尔会崩溃。libdbus有时会在高并发环境下出现崩溃,这是一个较难复现的问题,并不会频繁出现,已在1.13.6版本中修复。6. dbus-daemon在某些极端情况下无法正确结束。如果D-Bus在运行时收到多个信号,其处理过程可能会非正常结束,无法正确关闭,需强制杀死进程,已在1.13.8版本中修复。所以,尽管D-Bus 1.10.6版本比较稳定,但仍存在一定Bug与问题,尤其在高并发或复杂环境下会更易暴露出来。

你可能感兴趣的:(qt,c++)