segment fault

一 形成segment fault,產生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最後一個以後會出問題,會溢出,雖然能夠for(iter=q.begin();(iter+1)!=q.end();iter++)能夠不溢出,可是不能erase最後一個元素。 //網上說由於erase後,iterator會移到它的下一個元素上,此時你在對它++, //至關於一次移動了2個位置,這樣可能會越界,就會出錯,這樣比較安會,可是仍是沒有解決問題 for(iter=q.begin();iter!=q.end();) q.erase(iter++);

容器:vector、set、map經常使用操做,segment fault問題 函數


1.內存訪問越界 spa

 a) 因爲使用錯誤的下標,致使數組訪問越界 線程

 b) 搜索字符串時,依靠字符串結束符來判斷字符串是否結束,可是字符串沒有正常的使用結束符 指針

 c) 使用strcpy, strcat, sprintf, strcmp, strcasecmp等字符串操做函數,將目標字符串讀/寫爆。應該使用strncpy, strlcpy, strncat, strlcat, snprintf, strncmp, strncasecmp等函數防止讀寫越界。 code

2 多線程程序使用了線程不安全的函數。 內存

3 多線程讀寫的數據未加鎖保護。對於會被多個線程同時訪問的全局數據,應該注意加鎖保護,不然很容易形成core dump 字符串

4 非法指針

a) 使用空指針

b) 隨意使用指針轉換。一個指向一段內存的指針,除非肯定這段內存原先就分配爲某種結構或類型,或者這種結構或類型的數組,不然不要將它轉換爲這種結構或類型的指針,而應該將這段內存拷貝到一個這種結構或類型中,再訪問這個結構或類型。這是由於若是這段內存的開始地址不是按照這種結構或類型對齊的,那麼訪問它時就很容易由於bus error而core dump.

5 堆棧溢出.不要使用大的局部變量(由於局部變量都分配在棧上),這樣容易形成堆棧溢出,破壞系統的棧和堆結構,致使出現莫名其妙的錯誤。

相關文章
相關標籤/搜索