1. 程式人生 > >C語言禍根之看不見的錯誤,那些年學指針從入門到如土都是內存問題

C語言禍根之看不見的錯誤,那些年學指針從入門到如土都是內存問題

ont spa 有關 沒有 解析 分發 bbu 入門到 錯誤管理

技術分享圖片

是那樣的愛學習

技術分享圖片

那一刻從入門到入土

技術分享圖片

醜拒

前言

C 語言程序中的內存錯誤非常有害:它們很常見,並且可能導致嚴重的後果,最難受的極大多數時候內存問題看不見,也摸不著。編譯正確運行出錯,讓新手從入門到入土,讓老手也頭痛不已,花費很多時間進行查找和修復。很多時候最嚴重的安全問題都是由簡單的內存錯誤造成的,導致軟件崩潰,系統崩潰。與內存相關的編程是如此重要,而在實踐中正確應用又是如此困難,以致於它支配著面向對象編程語言、功能性編程語言、高級編程語言、聲明性編程語言和另外一些編程語言的所有其他變量或理論。因此,出於所有這些原因,需要特別關註 C 的內存問題。讓我們看一看如何解決這些問題,先不談是哪種語言。

小編將帶您了解一些良好的和內存相關的編碼實踐,以將內存錯誤保持在控制範圍內。

技術分享圖片

小編開始裝逼清退後30米

內存錯誤分類

所有可能存在的實際問題:

技術分享圖片

對問題很嚴重,原因卻很簡單

內存泄漏:在分配資源時會發生內存泄漏,但是它從不回收。

技術分享圖片

小編解析看下面

您看到問題了嗎?除非 Fucntion2對 free釋放的內存具有不尋常的響應能力,否則每次對Fucntion1的調用都會泄漏 100 字節。在記憶棒增量分發數兆字節內存時,一次泄漏是微不足道的,但是連續操作數小時後,即使如此小的泄漏也會削弱應用程序。

技術分享圖片

小編解析看下面

fopen的語義需要補充性的 fclose。在沒有 fclose的情況下,C 標準不能指定發生的情況時,很可能是內存泄漏。其他資源(如信號量、網絡句柄、數據庫連接等)同樣值得考慮。尤其對於C語言文件操作來說,沒有關閉掉文件,很容易造成文件讀寫失敗。

內存錯誤分配:指針的初始化

技術分享圖片

這一點還是很簡單

這些錯誤通常也不太嚴重,稍微對指針概念比較掌握應該是沒什麽問題的。

懸空指針:野指針(沒有指向的指針)

技術分享圖片

這種情況尤其在C語言鏈表刪除操作常見

數組邊界違規

數組邊界違規十分危險,它是內存錯誤管理的最後一個主要類別。如果一個數組大小事100,超過100,則會發生什麽情況?回答:難以預料,但是它可能與良好情形相差甚遠。特別是,C 復制一個字符串,該字符串不適於為它分配的 100 個字符。在任何常規實現中,“超過的”字符會覆蓋內存中的其他數據。內存中數據分配的布局非常復雜並且難以再現,所以任何癥狀都不可能追溯到源代碼級別的具體錯誤。這些錯誤通常會導致數百萬美元的損失。

技術分享圖片

我有一個微信公眾號,經常會分享一些C語言/C++技術相關的幹貨;如果你喜歡我的分享,可以用微信搜索“C語言學習部落”關註

歡迎大家加入千人交流答疑裙:627+012+464


C語言禍根之看不見的錯誤,那些年學指針從入門到如土都是內存問題