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 多线程
    在多线程的环境下,对于关键资源需要加锁,特别是在对容器变量进行修改时。

  • 相关阅读:
    POJ 2752 Seek the Name, Seek the Fame
    POJ 2406 Power Strings
    KMP 算法总结
    SGU 275 To xor or not to xor
    hihocoder 1196 高斯消元.二
    hihoCoder 1195 高斯消元.一
    UvaLive 5026 Building Roads
    HDU 2196 computer
    Notions of Flow Networks and Flows
    C/C++代码中的笔误
  • 原文地址:https://www.cnblogs.com/wangwangever/p/12882717.html
Copyright © 2011-2022 走看看