當我們在用C++做底層驅動的時候,經常會遇到內存不足的警告,究其原因,往往是因為內存出現溢出,泄露或者越界等原因。那么他們之間有什么聯系嗎?
內存溢出(out of memory)
是指程序在申請內存時,沒有足夠的內存空間供其使用。
內存泄漏(memory leak)
是指程序在申請內存后,無法釋放已申請的內存空間,占用有用內存。
注:內存泄漏最終會導致內存溢出
簡單理解,內存溢出就是要求分配的內存超出了系統所給的。內存泄漏是指向系統申請分配內存進行使用(new),但是用完后不歸還(delete),導致占用有效內存。
內存泄漏可分為4類:
1.常發性內存泄漏
引起內存泄漏的代碼會被很多次執行,每次執行的時候都會導致內存泄漏
2.偶發性內存泄漏
在某些特定的環境下執行引起內存泄漏的代碼,才會引起內存泄漏
從以上兩種內存泄漏的方式來看,測試環境和測試方法在程序生命周期的重要性是不可或缺的。
3.一次性內存泄漏
代碼只會執行一次,但總有一塊內存發生泄漏,多見於構造類的時候,析構函數沒有釋放內存。
4.隱式泄漏
程序運行過程中不斷的分配內存,直到結束時才釋放內存,但一般服務器程序會運行較長的時間,不及時釋放也會導致內存耗盡以至於內存泄漏。
綜上所述,一次性內存泄漏對用戶的程序維護是沒有什么實質性的傷害,但在實際生活中,我們還是盡可能要避免此類的事件發生。
內存越界
是指向系統申請一塊內存后,使用時卻超出申請范圍。比如一些操作內存的函數:sprintf、strcpy、strcat、vsprintf、memcpy、memset、memmove。當造成內存泄漏的代碼運行時,所帶來的錯誤是無法避免的,通常會造成
1.破壞了堆中內存內存分配信息數據
2.破壞了程序其他對象的內存空間
3.破壞了空閑內存塊
附:如果在之前你的程序運行一切正常,但因為你新增了幾個類的成員變量或者修改了一部分代碼(前提是保證你的這些修改是完全正確的)而導致程序發生錯誤,則因考慮是否是內存被破壞的原因了,重點排查內存是否越界。
緩沖區溢出(棧溢出)
程序為了臨時存取數據的需要,一般會分配一些內存空間稱為緩沖區。如果向緩沖區中寫入緩沖區無法容納的數據,機會造成緩沖區以外的存儲單元被改寫,稱為緩沖區溢出。而棧溢出是緩沖區溢出的一種,原理也是相同的。分為上溢出和下溢出。其中,上溢出是指棧滿而又向其增加新的數據,導致數據溢出;下溢出是指空棧而又進行刪除操作等,導致空間溢出。
---------------------