C 什麼時候出現訪問越界?

2021-09-24 13:41:27 字數 740 閱讀 1372

所謂記憶體訪問越界,其實就是指程式訪問了系統已經**或者未經分配的記憶體。和記憶體洩漏不一樣,記憶體洩漏指的是系統分配給你記憶體,你卻找不到它(一般是由於儲存這塊記憶體的指標被覆蓋了),因此導致這塊記憶體資源無法釋放,稱作記憶體洩漏,記憶體洩漏是很嚴重的問題,隨著程式的執行,會導致系統的記憶體佔用量不斷增高,整個系統由於記憶體緊張而造成卡頓或者假死,如果這是伺服器,問題就嚴重了,而記憶體訪問越界帶來的問題,一般是不可預期的錯誤,程式有可能執行正常,結果也正確。或者程式執行正常,但是結果不正確,嚴重一點的結果就是非法訪問了受保護的記憶體,程序直接掛掉了。

下面是記憶體訪問越界的例項:

訪問陣列越界。

用字串函式如strcpy,strcat等函式進行字串操作的時候,字串陣列空間不夠,導致記憶體訪問越界。

字串沒有末尾的『\0』,導致進行strcpy,用指標遍歷字串操作的時候,訪問越界。

通過new或者malloc開闢的記憶體,在**訪問時,沒有在申請長度以內,出現訪問越界。或者訪問了剛被free或者delete掉的記憶體。

函式返回了區域性變數或者臨時量的位址或者引用,函式返回後在呼叫方通過位址或者引用進行訪問越界。

指標指向臨時物件,語句完成後,臨時物件被析構,此時通過指標呼叫這個臨時物件,出現越界。

使用了不合理的型別強轉,讓較大型別的指標指向較小記憶體的指標,通過大型別指標間接訪問記憶體,出現訪問越界。比如把基類強轉成派生類,讓派生類指標指向乙個基類物件。

多執行緒訪問共享物件時,某個執行緒訪問它,這個物件可能在其它執行緒中被析構掉了,就出現訪問越界。

C 什麼時候用new,什麼時候不用new

void func void main void main c 裡面,建立物件,classname object 初始化引數 在stack棧裡面分配空間,自動釋放。或者用 classname object new classnam 在heap堆裡面分配空間,要手動釋放。當你不確定需要多大的時候用ne...

在c 中, 什麼時候用 什麼時候用

在某種意義上,和 是意思相對的兩個東西,把它們放在一起有什麼意義呢?為了理解指標的這種做法,我們先複習一下c c 程式設計中無所不在的指標概念。我們都知道myclass 的意思 指向某個物件的指標,此物件的型別為myclass。void func1 myclass pmyclass 例如 mycla...

什麼時候用exists 什麼時候用in

in not in exists not exists 使用exists,oracle會首先檢查主查詢,然後執行子查詢直到它找到第乙個匹配項,這就節省了時間。oracle在執行in子查詢時,首先執行 子查詢,並將獲得的結果列表存放在乙個加了索引的臨時表中。在執行子查詢之前,系統先將主查詢掛起 待子查...