對於任何的作業系統來說,記憶體都是很寶貴的乙個地方。所以,對於程式語言來說,記憶體管理就顯得尤為重要。
c語言**在記憶體中執行的時候,我們大致將占用的記憶體分為4塊區域:**區、靜態區、棧區、堆區。這4各區域,有著各自的特點,他們也儲存著我們的程式在執行中的不同型別的資料。弄明白了這4個區域的資料儲存特點,也就對於記憶體管理有了差不多的認識了。
**區:存放程式執行時的函式體的二進位制**,由作業系統進行管理。
靜態區:全域性變數和靜態變數(static修飾的變數)儲存的區域,當程式執行結束後由作業系統釋放。
棧區:存放函式引數,區域性變數,由編譯器自動分配釋放。
堆區:儲存程式設計師用malloc和new申請的變數,這種是動態申請記憶體,在變數不再被使用時有程式設計師自行free和delete,若不處理,在程式執行完成後由作業系統**。但是這樣在程式結束之前,記憶體會一直被占用,浪費記憶體空間
從上面的總結來看,我們在使用記憶體的時候要注意幾點:
1、動態分配記憶體時,要注意及時釋放。
2、盡可能的不使用全域性變數或靜態變數。
3、**簡潔。
在實際開發中,出現記憶體問題是很麻煩的一件事情,編譯器是不能自動發現這些錯誤的,在程式執行的時候才會**捉到。而且這類錯誤也是時隱時現的,很難修改。這樣就要求我們在**的編寫過程中就要注意記憶體管理的問題。下面來說幾個容易出錯的情況:
1、使用了分配未成功的記憶體。
在我們申請記憶體的時候,會出現一種情況,那就是記憶體分配不成功。對於這種可能出現的問題,就要求我們在使用之前先去檢查指標是否為空。如果是動態分配的記憶體,那麼在使用之前先用if(p == null )判斷。如果是作為函式的引數,使用assert(p != null)檢查。
2、未對已經分配成功的記憶體初始化。
對於乙個變數來說,如果沒有初始化,那麼記憶體的預設初始值究竟是什麼,這個沒有標準的規定,有的時候為零,但也有的時候不為零,這樣就會出現因為變數初始值而引發一些問題,這種問題只會體現在資料上,也是很難排查的。所以,給申請的變數賦初值是很有必要的。
3、記憶體越界。
這個問題最好也最多的體現是陣列越界問題。這個就需要程式設計師自己去注意自己申請的空間了。
4、沒有及時釋放,導致記憶體洩漏。
需要程式設計師自己去釋放的記憶體只有動態分配的堆區的記憶體,要管理好著一塊的記憶體,使其不出問題,那麼,記憶體申請和釋放必須配對。只申請,不釋放,記憶體一直被占用,這樣總會有記憶體不夠的時候。
5、記憶體已經被釋放,還繼續使用。
這個問題體現在,動態申請的記憶體被釋放後,還繼續使用的。函式返回指向棧區的指標。程式設計複雜,不知何時將記憶體釋放了。第一種情況的解決還是在程式設計師本身,注意記憶體應在不再使用的時候釋放。第二種情況,是因為棧區的只是乙個暫存區,在函式結束的時候,記憶體就被**了。第三種情況就需要重新設計資料型別了。
以上的5點,基本上已經體現了記憶體可能出現的問題,開發的時候一定要謹記。記憶體是很寶貴的資源,使用的時候一定要小心!小心!!再小心!!!
c語言記憶體管理
在c語言中,根據資料在記憶體中存在的時間 生存期 不同,將記憶體空間分為三個區 1.程式區 用於儲存程式的 即程式的二進位制 存放函式體的二進位制 2.靜態儲存區 用於儲存全域性變數和靜態變數,這些變數的空間在程式編譯時就已經分配好了.全域性變數和靜態變數的儲存是放在一塊的,初始化的全域性變數和靜態...
C語言 記憶體管理
記憶體管理一號傳送門 記憶體管理二號傳送門 對於乙個c語言程式而言,記憶體空間主要由五個部分組成 段 text 資料段 data bss段 bss 堆和棧組成,其中 段,資料段和bss段是編譯的時候由編譯器分配的,而堆和棧是程式執行的時候由系統分配的。在上圖中,由編譯器分配的位址空間都是在連線的時候...
C語言記憶體管理
程式設計師們經常編寫記憶體管理程式,往往提心吊膽。如果不想觸雷,唯一的解決辦法就是發現所有潛伏的地雷並且排除它們,躲是躲不了的。本章的內容比一般教科書的要深入得多,讀者需細心閱讀,做到真正地通曉記憶體管理。7.1記憶體分配方式 記憶體分配方式有三種 1 從靜態儲存區域分配。內存在程式編譯的時候就已經...