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