segment fault
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
一 造成segment fault,產(chǎn)生core dump的可能原因
容器使用越界問題
for(iter=q.begin();iter!=q.end();iter++)
???q.erase(iter);
deque<int> q; for(i=0;i<15;i++)q.push_back(i);//先輸出 deque<int>::iterator iter=q.begin(); for(iter=q.begin();iter!=q.end();iter++)cout<<*iter<<" "; cout<<"*q.end()為"<<*q.end()<<endl;//從這里可以看出*q.end()并不是14 //這里erase() for(iter=q.begin();iter!=q.end();iter++)q.erase(iter);這樣在erase最后一個(gè)之后會(huì)出問題,會(huì)溢出,雖然可以for(iter=q.begin();(iter+1)!=q.end();iter++)可以不溢出,但是不能erase最后一個(gè)元素。 //網(wǎng)上說因?yàn)閑rase后,iterator會(huì)移到它的下一個(gè)元素上,此時(shí)你在對(duì)它++, //相當(dāng)于一次移動(dòng)了2個(gè)位置,這樣可能會(huì)越界,就會(huì)出錯(cuò),這樣比較安會(huì),但是還是沒有解決問題 for(iter=q.begin();iter!=q.end();)q.erase(iter++);
容器:vector、set、map常用操作,segment fault問題
1.內(nèi)存訪問越界
?a) 由于使用錯(cuò)誤的下標(biāo),導(dǎo)致數(shù)組訪問越界
?b) 搜索字符串時(shí),依靠字符串結(jié)束符來判斷字符串是否結(jié)束,但是字符串沒有正常的使用結(jié)束符
?c) 使用strcpy, strcat, sprintf, strcmp, strcasecmp等字符串操作函數(shù),將目標(biāo)字符串讀/寫爆。應(yīng)該使用strncpy, strlcpy, strncat, strlcat, snprintf, strncmp, strncasecmp等函數(shù)防止讀寫越界。
2 多線程程序使用了線程不安全的函數(shù)。
3 多線程讀寫的數(shù)據(jù)未加鎖保護(hù)。對(duì)于會(huì)被多個(gè)線程同時(shí)訪問的全局?jǐn)?shù)據(jù),應(yīng)該注意加鎖保護(hù),否則很容易造成core dump
4 非法指針
a) 使用空指針
b) 隨意使用指針轉(zhuǎn)換。一個(gè)指向一段內(nèi)存的指針,除非確定這段內(nèi)存原先就分配為某種結(jié)構(gòu)或類型,或者這種結(jié)構(gòu)或類型的數(shù)組,否則不要將它轉(zhuǎn)換為這種結(jié)構(gòu)或類型的指針,而應(yīng)該將這段內(nèi)存拷貝到一個(gè)這種結(jié)構(gòu)或類型中,再訪問這個(gè)結(jié)構(gòu)或類型。這是因?yàn)槿绻@段內(nèi)存的開始地址不是按照這種結(jié)構(gòu)或類型對(duì)齊的,那么訪問它時(shí)就很容易因?yàn)閎us error而core dump.
5 堆棧溢出.不要使用大的局部變量(因?yàn)榫植孔兞慷挤峙湓跅I?#xff09;,這樣容易造成堆棧溢出,破壞系統(tǒng)的棧和堆結(jié)構(gòu),導(dǎo)致出現(xiàn)莫名其妙的錯(cuò)誤。
轉(zhuǎn)載于:https://my.oschina.net/u/347414/blog/173217
總結(jié)
以上是生活随笔為你收集整理的segment fault的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: I/O Performance HOWT
- 下一篇: 以色列全国路网遭到了网络攻击 造成交通拥