關於棧溢位,記憶體洩露 越界 緩衝區溢位

2021-09-28 15:04:32 字數 994 閱讀 4721

棧溢位:

顧名思義:棧滿了,好比已經裝滿水的桶,這個時候你還得往裡面再加上一點,水就溢位來了,常見的棧溢位則是遞迴層次太深,為什麼遞迴層次太深會導致棧溢位呢?我們知道程式分配空間的時候會給我們分配乙個棧的空間供我們使用,在棧上儲存了呼叫函式的一些資訊,比如形參,以及一些其他資訊,在函式退出後便將棧上空間歸還。但是我們一直遞迴的呼叫,導致函式沒有辦法返回,也就沒有辦法將空間歸還,一直迴圈下去,必定造成棧的空間使用完。

其他造成棧空間的記憶體使用完的情況都大體類似,都是一直在向棧申請,導致棧無法滿足需求。

記憶體洩漏:

大多數說法是:內存在申請後如果沒有被**,其實個人覺得容易讓人產生誤解,比如對於需要連續跑幾周、幾個月,甚至幾年的伺服器來說,如果在執行期間,我們申請了記憶體,並且越來越多,我們等到程式關閉的時候再來釋放我們申請的記憶體,嚴格意義上來說,我沒有洩漏啊,我最後都釋放了啊,可是隨著執行時間的增長,記憶體會消耗殆盡,程式崩了是不是覺得很意外、很驚喜、so 應該說:內存在申請後沒有被及時釋放,至於什麼時候算及時,個人覺得應該在使用完之後應該立即釋放。如果你說你就是要頻繁的申請記憶體,程式結束前才能做釋放,額。。。不知道是否有這樣的需求,至少我還沒遇到。

根據網上的一些大神總結的歸納下:

1、常發性記憶體洩漏:經常性的申請記憶體,但是沒有釋放

2、偶發性記憶體洩漏:偶爾性的申請卻不釋放,其實跟常發性一樣,只是頻率而已。

3、一次性記憶體洩漏:只會發生一次,比如在建構函式中申請,而且這個物件只例項化乙個。

4、隱式記憶體洩漏:就是我們說的,執行期間申請,但是程式結束前才釋放。

記憶體洩漏其實絕大多數並不能影響到使用者,但是記憶體堆積才是萬惡之源。

記憶體越界:

比如你買了一條街上的100號到120號的房子,你在100到120之間的房子隨便折騰,這個是你的權力,因為這個是你的房子,但是某一天,你說你要跑到121房子去住,你看別人不打死你,因為你訪問了不屬於你的空間。最常見的就是陣列的越界,記憶體拷貝等記憶體操作函式。

緩衝區溢位:

棧溢位就是緩衝區溢位的一種,就是往緩衝區寫入太多東西

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

記憶體溢位就是你要求分配的記憶體超出了系統能給你的,系統不能滿足 需求,於是產生溢位。記憶體洩漏是指你向系統申請分配記憶體進行使用 new 可是使用 完了以後卻不歸還 delete 結果你申請到的那塊記憶體你自己也不能 再訪問 也許你把它的位址給弄丟了 而系統也不能再次將它分配 給需要的程式。乙個盤...

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

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

緩衝區溢位 棧溢位

1 緩衝區概念 緩衝區 buffer 又稱為快取,它是記憶體空間的一部分。也就是說,在記憶體空間中預留了一定的儲存空間,這些儲存空間用來緩衝輸入或輸出的資料,這部分預留的空間就叫做緩衝區。使用緩衝區有兩個好處 1 減少實際物理讀寫次數 2 緩衝區在建立時就被分配記憶體,這塊記憶體區域一直被重用,可以...