C語言禍根之看不見的錯誤,那些年學指針從入門到如土都是內存問題
是那樣的愛學習
那一刻從入門到入土
醜拒
前言
C 語言程序中的內存錯誤非常有害:它們很常見,並且可能導致嚴重的後果,最難受的極大多數時候內存問題看不見,也摸不著。編譯正確運行出錯,讓新手從入門到入土,讓老手也頭痛不已,花費很多時間進行查找和修復。很多時候最嚴重的安全問題都是由簡單的內存錯誤造成的,導致軟件崩潰,系統崩潰。與內存相關的編程是如此重要,而在實踐中正確應用又是如此困難,以致於它支配著面向對象編程語言、功能性編程語言、高級編程語言、聲明性編程語言和另外一些編程語言的所有其他變量或理論。因此,出於所有這些原因,需要特別關註 C 的內存問題。讓我們看一看如何解決這些問題,先不談是哪種語言。
小編將帶您了解一些良好的和內存相關的編碼實踐,以將內存錯誤保持在控制範圍內。
小編開始裝逼清退後30米
內存錯誤分類
所有可能存在的實際問題:
對問題很嚴重,原因卻很簡單
內存泄漏:在分配資源時會發生內存泄漏,但是它從不回收。
小編解析看下面
您看到問題了嗎?除非 Fucntion2對 free釋放的內存具有不尋常的響應能力,否則每次對Fucntion1的調用都會泄漏 100 字節。在記憶棒增量分發數兆字節內存時,一次泄漏是微不足道的,但是連續操作數小時後,即使如此小的泄漏也會削弱應用程序。
小編解析看下面
fopen的語義需要補充性的 fclose。在沒有 fclose的情況下,C 標準不能指定發生的情況時,很可能是內存泄漏。其他資源(如信號量、網絡句柄、數據庫連接等)同樣值得考慮。尤其對於C語言文件操作來說,沒有關閉掉文件,很容易造成文件讀寫失敗。
內存錯誤分配:指針的初始化
這一點還是很簡單
這些錯誤通常也不太嚴重,稍微對指針概念比較掌握應該是沒什麽問題的。
懸空指針:野指針(沒有指向的指針)
這種情況尤其在C語言鏈表刪除操作常見
數組邊界違規
數組邊界違規十分危險,它是內存錯誤管理的最後一個主要類別。如果一個數組大小事100,超過100,則會發生什麽情況?回答:難以預料,但是它可能與良好情形相差甚遠。特別是,C 復制一個字符串,該字符串不適於為它分配的 100 個字符。在任何常規實現中,“超過的”字符會覆蓋內存中的其他數據。內存中數據分配的布局非常復雜並且難以再現,所以任何癥狀都不可能追溯到源代碼級別的具體錯誤。這些錯誤通常會導致數百萬美元的損失。
我有一個微信公眾號,經常會分享一些C語言/C++技術相關的幹貨;如果你喜歡我的分享,可以用微信搜索“C語言學習部落”關註
C語言禍根之看不見的錯誤,那些年學指針從入門到如土都是內存問題