野指標 記憶體洩漏 快取區溢位 棧溢位

2021-07-11 14:02:18 字數 1165 閱讀 2775

今天梳理一下相關概念,用自己的語言來描述下:

1.野指標

比如說吧:

int main()

輸出:當程式執行時是作為乙個程序,乙個程序有自己的虛擬空間,低位址是程式**和資料,然後是執行時堆,再然後是共享庫(標準庫之類的)

然後是棧空間,用於函式區域性呼叫時

此時b指向了低位的程序位址,此時操作野指標b讀取可能不報錯,但是一旦寫資料,程式就奔潰了

在沒有保護措施的情況下隨意修改程序位址資料是很危險的,一般高位的os核心位址都是進行保護的。

2.記憶體洩露

給出一段程式來說明,

void func()

void main()

在main函式迴圈呼叫func,不斷的分配記憶體空間,而且你要知道完全由你掌控,想分配多少就多少,

但是你沒有delete,os認為這是你的事,然後不釋放一直分配直到

記憶體耗盡程式崩掉,如果os沒能kill掉,就會卡死。。宕機了。。,

3.快取區溢位

其實感覺跟那個野指標也類似但產生原因是不一樣的

來看看危險的gets函式

char *gets(char *s)

void echo()

上面的buf很小,當你鍵盤輸入很大的時候,沒有辦法確定為儲存整個

字串分配了足夠的空間,所以你使用gets時候,很容易就對非法位址寫入了

資料,而按照順序表連續分配,你寫入的是程序內高位位址的資料,這時你如果改寫了其他的資料,如下一條指令的

位址,就會造成程式嚴重的錯誤,如果是執行了惡意**,那你就被入侵了

4.棧溢位

其實很上面基本是一致的,這裡用另乙個**來說明棧溢位

要知道棧空間是很小的,大概1mb左右,視不同的編譯器不同。

所以如果在函式內,定義這種** int a[100000][10000000],一旦執行到該函式就會崩掉

比如你寫了一堆函式,這個函式在最後執行,然後崩了,如果你不懂,你才不會考慮到是棧

溢位造成的錯誤,你會認為這個函式實在沒有邏輯錯誤,最終你在其他函式上找原因,然後

這不是相當於過濾掉了特務。。。。所以程式設計師基礎要打好

記憶體洩漏 記憶體溢位 記憶體越界 緩衝區溢位 棧溢位

內容會持續更新,有錯誤的地方歡迎指正,謝謝 記憶體洩漏 memory leak 是指程式中己動態分配的堆記憶體由於某種原因程式未釋放或無法釋放,造成系統記憶體的浪費,導致程式執行速度減慢甚至系統崩潰等嚴重後果。記憶體溢位 out of memory 是指程式在申請記憶體時,沒有足夠的記憶體空間供其使...

C C 中的記憶體洩漏 記憶體溢位 野指標

記憶體溢位 野指標發生原因class object object intmain class object1 int main 發生原因 為什麼說strcpy和strncpy是c 的危險函式 2.strncpy strncpy dest,src,sizeof dest dest sizeof des...

野指標和記憶體溢位

1.野指標 野指標是表示指標指向的記憶體空間被釋放了,導致這個指標指向了不能使用的空間,如果在訪問則會出錯,所以一般在釋放空間後給野指標賦值null 例 intmain intargc,const char argv 銷毀開闢的空間後,p指標指向了不可用的空間,此時p成為了野指標 2.記憶體溢位 記...