QT程式崩潰原因示例和分析

2022-08-26 03:09:08 字數 3298 閱讀 1042

程式崩潰的一般原因

一、記憶體訪問

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 多執行緒

在多執行緒的環境下,對於關鍵資源需要加鎖,特別是在對容器變數進行修改時。

C C 程式崩潰原因分析

我們執行程式時經常會遇到異常崩潰,也就是我們常說的crash,下面我想總結一下crash出現的原因。而導致crash的主要原因就是段錯誤 segmentation fault 是不是很熟悉,相信每個執行過c程式的小夥伴都見過這兩個單詞,而且這種錯誤一般不給其他提示,看著很糾結。導致段錯誤的原因一般有...

程式崩潰原因總結

測試環境 redhat 程式跑飛原因分析 程式崩潰分析 指標,空指標使用 null 非法指標 0x00000000 棧溢位,strcpy拷貝長字串到區域性變數 格式化串,printf漏寫或多寫變數 堆溢位,malloc會儲存一些控制資料 元資料 在分配給使用者的記憶體塊前 後位置。include i...

程式崩潰的常見原因

常出現程式崩潰的幾種狀況 程式崩潰對於程式猿來說,時經常出現的問題,如果你都沒有出現過,那大佬快收下我的膝蓋吧。程式崩潰一般都發生在執行時期,而崩潰的原因一般都是程式猿的失誤所導致的,在這裡我就總結了這幾種程式崩潰的 讀取未賦值的變數 這個錯誤一般是由於程式猿粗心大意,沒有給變數初始化和賦值,導致該...