zoukankan      html  css  js  c++  java
  • QT程序崩溃原因示例和分析

    程序崩溃的一般原因

    一、内存访问
    QT中的QList和他的了类QByteArrayList,QItemSelection,QQueue,QStringList以下标方式引用时,如果未对下标是由越界进行检查,就有可能会引起程序的崩溃。

    1.1 SIMIS-Teacher CreateUser.cpp
    数组越界,引起崩溃:

    另外还需要注意:ui.comboBox_structure->currentIndex(),在QT控件获取选中位置时,在未选中时多数返回-1,如果未加检查就在数组中引用就会引起问题。

        _map[DB_Field_role] = m_bTeacher ? _Role_Teac : _Role_Stu;

        _map[DB_Field_ParentID] = m_classIDList.at(ui.comboBox_structure->currentIndex());

    修改后代码:

        _map[DB_Field_role] = m_bTeacher ? _Role_Teac : _Role_Stu;

    const int ncIndex = ui.comboBox_structure->currentIndex();

        if((0 <= ncIndex) && (m_classIDList.size() > ncIndex)){

            _map[DB_Field_ParentID] = m_classIDList.at(ncIndex);/

        }

    1.2 UserInforManager  UserInforManager.cpp
    数组越界,引起崩溃:

    QVariantMap _user = _users[0];

                  _userRes << _user;

                  role = _user.value(DB_Field_role).toString();

    修改为:

    QVariantMap _user;

                  if (0 < _users.size()) {

                         _user = _users[0];

                         _userRes << _user;

                         role = _user.value(DB_Field_role).toString();

                  }

    1.3 UserInforManager  UserInforManager.cpp
    数组越界,引起崩溃:

    _oldMap = QueryUserInfor(getAccount(userID.toInt())).at(0);

    修改为:

    auto qlmTemp = QueryUserInfor(rDataBase, getAccount(rDataBase, userID.toInt()));

                  if (0 < qlmTemp.size()) {

                         _oldMap = qlmTemp[0];

                  }

    1.4 数据溢出
    char buffer[10];

    int counter;

    lstrcpy(buffer, "abcdefghik");

    在debug版中buffer的结束标志覆盖了counter的高位,但是除非counter的数值大于16M,否则不会引起问题。但是在release版中,counter可能被放在寄存器中,这样NULL就覆盖了buffer下面的空间,可能就是函数的返回地址,这将导致ACCESS ERROR。

    二、使用无效的迭代器
    2.1 引用无效的iterator
    Erase操作作迭代器it已经效,对其操作会引起未定义的问题。

        if (!bExist)//不存在删除

            {      

    vAllSelPackageUUID.erase(it);

       

                QString strTip = QString(QStringLiteral("文件%1不存在是否删除配置信息?")).arg(strFilePath);

                if (QMessageBox::Ok == QMessageBox::warning(NULL, QStringLiteral("提示"), strTip, QMessageBox::Ok | QMessageBox::Cancel))

                {

                    QString strConfigFile = ModifyPath(Cls_PackageDataInfo::GetInstance()->GetWorkPath()) + CONST_QSTR_SERVER_CONFIG_FILE;

                    Cls_PackageDataInfo::GetInstance()->GetPackageDataInfoFromServerByID(*it)->DelPackageConfig(strConfigFile);

                    bUpdateServerFile = true;

                }

                            continue;

            }

    建议修改为:

        if (!bExist)//不存在删除

            {          

                QString strTip = QString(QStringLiteral("文件%1不存在是否删除配置信息?")).arg(strFilePath);

                if (QMessageBox::Ok == QMessageBox::warning(NULL, QStringLiteral("提示"), strTip, QMessageBox::Ok | QMessageBox::Cancel))

                {

                    QString strConfigFile = ModifyPath(Cls_PackageDataInfo::GetInstance()->GetWorkPath()) + CONST_QSTR_SERVER_CONFIG_FILE;

                    Cls_PackageDataInfo::GetInstance()->GetPackageDataInfoFromServerByID(*it)->DelPackageConfig(strConfigFile);

                    bUpdateServerFile = true;

                }

    vAllSelPackageUUID.erase(it);

                            continue;

            }

    三、杂项
    3.1 Assert问题
    ASSERT在Release版本中是不会被编译的。 假如你在这些语句中加了程序中必须要有的代码。例:

    ASSERT(pNewObj = new CMyClass);

    pNewObj->MyFunction();

    这种时候Release版本中的pNewObj不会分配到空间,所以Assert中的代码,不能有边际效应。

    3.2 库版本
    人们将不同版本DLL混合造成的不一致性形象的称为 “动态连接库的地狱“(DLL Hell)。不能将debug和release版的DLL混合在一起使用。debug都是debug版,release版都是release版。

    debug版和release版会引起难查找的问题。

    3.3 多线程
    在多线程的环境下,对于关键资源需要加锁,特别是在对容器变量进行修改时。

  • 相关阅读:
    【好文翻译】10个免费的压力测试工具(Web)
    【高手介绍】谷歌内部代码审查(code review)介绍[翻译]
    【淘宝内部好文转发】我们每天面对的互联网用户到底在想什么?
    写给开发者:别让他人用你的App赚钱[转]
    新手应该知道的二十三条关于JavaScript的最佳实践
    开发人员应该为这样的代码感到惭愧
    [Web App]必胜客宅急送产品设计思路介绍[转]
    WallsEveryDay 必应桌面壁纸
    GroupLayout 布局
    JButton 做图片框
  • 原文地址:https://www.cnblogs.com/wangwangever/p/12882717.html
Copyright © 2011-2022 走看看