在C/C++中關於內存問題的總結

一、內存分配方式

1.從靜態存儲區域分配。內存在程序編譯的過程中就已經分配好,這塊內存在程序的整個運行期間都存在。例如:全局變量和static變量。

2.在棧上創建。在執行函數時,函數內局部變量的存儲單元都可以在棧上創建,函數運行結束時,這些存儲單元會被自動釋放,棧內存分配運算內置於處理器的指令集中,效率很高,但分配的內存數量有限。

3.從堆上分配,又被稱爲動態內存分配。程序在運行過程中用malloc和new申請任意大小的內存,程序員自己負責在何時用free或者delete釋放內存。內存的存在週期由我們自己決定,比較靈活,但同時出現的問題也比較多。

二、經常會出現的內存問題以及問題分析和解決方法

1.內存重複釋放(一般在出現double free時基本上都是這個原因)

*關於double free會在下篇博客中講解

2.內存泄漏。申請的內存忘了釋放。

3.內存越界使用

4.內存未分配成功確使用了它

5.內存分配成功卻沒有初始化就使用了內存

6.使用了無效指針

(1)已經釋放對象,卻繼續操作改指針所指的對象

    a.程序當中的對象調用關係過於複雜,是在難以搞清哪個對象是否已經釋放了內存,從根本上解決對象管理混亂的情況。

    b.函數的return語句寫錯了,注意不要返回指向“棧內存”的指針或者引用。

    c.使用free或者delete釋放之後,沒有將其置空,導致產生野指針。

(2)多線程中某一動態分配的對象同時被兩個線程使用,一個線程釋放了該對象,另一個線程卻繼續對該對象進行操作

三、使用規則

1.在malloc或者new之後應立即檢查是否將其置爲空,防止其使用指針值爲NULL的空間。

2.不要忘記爲指針和數組賦初始值,防止將未被初始化的內存作爲右值使用

3.避免數組或者指針的下標越界,要特別注意多一,少一操作

4.動態內存的申請與釋放必須配對使用,避免出現內存泄漏

5.用free或者delete之後要立即將其置爲空,防止出現“野指針”

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章