内存泄漏 和 内存溢出
在計算機科學中,內存泄漏(memory leak)指由于疏忽或錯誤造成程序未能釋放已經不再使用的內存的情況。內存泄漏并非指內存在物理上的消失,而是應用程序分配某段內存后,由于設計錯誤,失去了對該段內存的控制,因而造成了內存的浪費。內存泄漏與許多其他問題有著相似的癥狀,并且通常情況下只能由那些可以獲得程序源代碼的程序員才可以分析出來。然而,有不少人習慣于把任何不需要的內存使用的增加描述為內存泄漏,嚴格意義上來說這是不準確的。
一般我們常說的內存泄漏是指堆內存的泄漏。堆內存是指程序從堆中分配的,大小任意的(內存塊的大小可以在程序運行期決定),使用完后必須顯式釋放的內存。應用程序一般使用malloc,calloc,realloc,new等函數從堆中分配到一塊內存,使用完后,程序必須負責相應的調用free或delete釋放該內存塊,否則,這塊內存就不能被再次使用,我們就說這塊內存泄漏了。
內存溢出就是你要求分配的內存超出了系統能給你的,系統不能滿足需求,于是產生溢出。
比方說棧,棧滿時再做進棧必定產生空間溢出,叫上溢,棧空時再做退棧也產生空間溢出,稱為下溢。
這是程序語言中的一個概念,典型的,在C語言中,在分配數組時為其分配的長度是1024,但往其中裝入超過1024個數據時,由于C語言不會對數組操作進行越界檢查,就會造成內存溢出錯誤
在程序員設計的代碼中包含的“內存溢出”漏洞實在太多了。
導致內存溢出問題的原因有很多,比如:?
(1) 使用非類型安全(non-type-safe)的語言如 C/C++ 等。?
(2) 以不可靠的方式存取或者復制內存緩沖區。?
(3) 編譯器設置的內存緩沖區太靠近關鍵數據結構。?
下面來分析這些因素:?
1. 內存溢出問題是 C 語言或者 C++ 語言所固有的缺陷,它們既不檢查數組邊界,又不檢查類型可靠性(type-safety)。眾所周知,用 C/C++ 語言開發的程序由于目標代碼非常接近機器內核,因而能夠直接訪問內存和寄存器,這種特性大大提升了 C/C++ 語言代碼的性能。只要合理編碼,C/C++ 應用程序在執行效率上必然優于其它高級語言。然而,C/C++ 語言導致內存溢出問題的可能性也要大許多。其他語言也存在內容溢出問題,但它往往不是程序員的失誤,而是應用程序的運行時環境出錯所致。?
2. 當應用程序讀取用戶(也可能是惡意攻擊者)數據,試圖復制到應用程序開辟的內存緩沖區中,卻無法保證緩沖區的空間足夠時(換言之,假設代碼申請了 N 字節大小的內存緩沖區,隨后又向其中復制超過 N 字節的數據)。內存緩沖區就可能會溢出。想一想,如果你向 12 盎司的玻璃杯中倒入 16 盎司水,那么多出來的 4 盎司水怎么辦?當然會滿到玻璃杯外面了!?
3. 最重要的是,C/C++ 編譯器開辟的內存緩沖區常常鄰近重要的數據結構。現在假設某個函數的堆棧緊接在在內存緩沖區后面時,其中保存的函數返回地址就會與內存緩沖區相鄰。此時,惡意攻擊者就可以向內存緩沖區復制大量數據,從而使得內存緩沖區溢出并覆蓋原先保存于堆棧中的函數返回地址。這樣,函數的返回地址就被攻擊者換成了他指定的數值;一旦函數調用完畢,就會繼續執行“函數返回地址”處的代碼。非但如此,C++ 的某些其它數據結構,比如 v-table 、例外事件處理程序、函數指針等,也可能受到類似的攻擊。
轉載于:https://www.cnblogs.com/reynold-lei/p/3461322.html
總結
以上是生活随笔為你收集整理的内存泄漏 和 内存溢出的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 扩大缩小Linux物理分区大小
- 下一篇: 基于SharePoint 的企业信息平台