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