C 記憶體問題

2021-10-02 23:54:16 字數 974 閱讀 8819

一、記憶體分配方式

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之後要立即將其置為空,防止出現「野指標」

C 記憶體問題

可怕的記憶體問題,你一不注意,可能會讓你費勁半天,甚至是好幾天 1 申請記憶體不一定申請成功,因此申請記憶體後一定要判斷是否申請成功 如下 int p new int 30 if p cout 2 野指標問題 兩種 何為野指標,即乙個指標指著不合法的地方,或者指著無效的資料 a char p new...

C 記憶體問題

在系統開發過程中出現的bug相對而言是比較好解決的,花費在這個上面的除錯代價不是很大,但是在系統整合後的bug往往是難以定位的bug 最好方式是打樁,通過打樁可以初步鎖定出錯的位置,如 進入函式前列印日誌,離開時再次列印日誌 而這些難以定位的bug基本分為2類 記憶體錯誤和並非問題。1 記憶體洩露 ...

C 記憶體對齊問題

最近在開發客戶端網路連線過程遇到乙個非常奇怪的問題,這個問題卡了兩天多時間,百般嘗試,一籌莫展!一度讓我懷疑人生了 最後突然想到最近使用 pragma pack,設定記憶體對齊。當我取消這個 後,一切都正常了!事件起因與網路資料協議的定義 struct taginfo word為兩個位元組,byte...