一、記憶體分配方式
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...