對于任何的操作系統來說,內存都是很寶貴的一個地方。所以,對于編程語言來說,內存管理就顯得尤為重要。
C語言代碼在內存中運行的時候,我們大致將占用的內存分為4塊區域:代碼區、靜態區、棧區、堆區。這4各區域,有著各自的特點,他們也存儲著我們的程序在運行中的不同類型的數據。弄明白了這4個區域的數據存儲特點,也就對于內存管理有了差不多的認識了。
代碼區:存放程序運行時的函數體的二進制代碼,由操作系統進行管理。
靜態區:全局變量和靜態變量(static修飾的變量)存儲的區域,當程序運行結束后由操作系統釋放。
棧區:存放函數參數,局部變量,由編譯器自動分配釋放。
堆區:存儲程序員用malloc和new申請的變量,這種是動態申請內存,在變量不再被使用時有程序員自行free和delete,若不處理,在程序執行完成后由操作系統回收。但是這樣在程序結束之前,內存會一直被占用,浪費內存空間
從上面的總結來看,我們在使用內存的時候要注意幾點:
1、動態分配內存時,要注意及時釋放。
2、盡可能的不使用全局變量或靜態變量。
3、代碼簡潔。
在實際開發中,出現內存問題是很麻煩的一件事情,編譯器是不能自動發現這些錯誤的,在程序運行的時候才會被捕捉到。而且這類錯誤也是時隱時現的,很難修改。這樣就要求我們在代碼的編寫過程中就要注意內存管理的問題。下面來說幾個容易出錯的情況:
1、使用了分配未成功的內存。
在我們申請內存的時候,會出現一種情況,那就是內存分配不成功。對于這種可能出現的問題,就要求我們在使用之前先去檢查指針是否為空。如果是動態分配的內存,那么在使用之前先用if(p == NULL )判斷。如果是作為函數的參數,使用assert(p != NULL)檢查。
2、未對已經分配成功的內存初始化。
對于一個變量來說,如果沒有初始化,那么內存的缺省初始值究竟是什么,這個沒有標準的規定,有的時候為零,但也有的時候不為零,這樣就會出現因為變量初始值而引發一些問題,這種問題只會體現在數據上,也是很難排查的。所以,給申請的變量賦初值是很有必要的。
3、內存越界。
這個問題最好也最多的體現是數組越界問題。這個就需要程序員自己去注意自己申請的空間了。
4、沒有及時釋放,導致內存泄漏。
需要程序員自己去釋放的內存只有動態分配的堆區的內存,要管理好著一塊的內存,使其不出問題,那么,內存申請和釋放必須配對。只申請,不釋放,內存一直被占用,這樣總會有內存不夠的時候。
5、內存已經被釋放,還繼續使用。
這個問題體現在,動態申請的內存被釋放后,還繼續使用的。函數返回指向棧區的指針。程序設計復雜,不知何時將內存釋放了。第一種情況的解決還是在程序員本身,注意內存應在不再使用的時候釋放。第二種情況,是因為棧區的只是一個暫存區,在函數結束的時候,內存就被回收了。第三種情況就需要重新設計數據類型了。
以上的5點,基本上已經體現了內存可能出現的問題,開發的時候一定要謹記。內存是很寶貴的資源,使用的時候一定要小心!小心!!再小心!!!
關于各種變量在內存中的表現的代碼部分,這里給一個地址:http://blog.csdn.net/ic_tv/article/details/46718907。這里的代碼寫的很詳細。
新聞熱點
疑難解答