在使用動態記憶體分配malloc()後,若不及時釋放記憶體free(),會造成記憶體洩漏;我總結了在釋放時經常出現錯誤的原因,頻率由高到低排序。
(一) 越界、漏寫sizeof()、realloc()第二個引數寫錯
int main()
free(arr);
return 0;
}
int main()
free(arr);
return 0;
}
假如已經malloc了10個單位,但是不夠用,還需要10個單位,此時應該用realloc()20個單位:
int main()
(二)改變指標的指向
由於malloc()一片連續塊後,連續快前後各有一區域包含頭資訊和尾資訊,頭資訊裡包含了連續快大小,在使用free()函式時,它會讀取頭資訊,然後釋放記憶體;倘若改變指標指向,則會出現讀取頭資訊失敗導致釋放記憶體失敗的崩潰:
int main()
(三) 重複釋放記憶體
int main()
(四)釋放不是動態申請的記憶體
int main()
程式崩潰原因總結
測試環境 redhat 程式跑飛原因分析 程式崩潰分析 指標,空指標使用 null 非法指標 0x00000000 棧溢位,strcpy拷貝長字串到區域性變數 格式化串,printf漏寫或多寫變數 堆溢位,malloc會儲存一些控制資料 元資料 在分配給使用者的記憶體塊前 後位置。include i...
web站點崩潰的原因總結
磁碟已滿 日誌檔案系統空間已滿時web伺服器也會被掛起,但機器自身被掛起的機率已大大減低。2.c指標錯誤 解決方案之一是使用 分析工具 如purify 對 進行仔細分析,以找出可能出現的洩漏問題。另一種方法是每隔一段時間,就清除並重啟程序。3.伺服器超載 解決問題的一種方法是將obj.conf引數r...
動態儲存管理 free崩潰
從變數值的存在時間 生存期 來觀察。有的變數在程式執行的整個過程都是存在的,而有的變數則是在呼叫其所在函式才臨時分配儲存單元,而在函式呼叫結束後該儲存單元就馬上釋放了,變數就不存在了。是指在程式執行期間由系統分配固定的儲存空間的方式。是指在程式執行期間根據需要進行動態的分配儲存空間的方式。下面我們討...