/*這一系列文章《c++ tips》是公司code committee專家會推薦工程師看的,感覺很好,拿出來與大家共同提高。並不是知道多少會使人與人產生差別,真正的差別在於你能做到多少。
--coofucoo
*/
在堆上分配記憶體
可能許多人對記憶體分配上的「棧stack」和「堆heap」還不是很明白。包括一些科班出身的人也不明白這兩個概念。簡單的來講,stack上分配的記憶體系統自動釋放,heap上分配的記憶體,系統不釋放,哪怕程式退出,那一塊記憶體還是在那裡。stack一般是靜態分配記憶體,heap上一般是動態分配記憶體。
由malloc
系統函式分配的記憶體就是從堆上分配記憶體。從堆上分配的記憶體一定要自己釋放。用free釋放,不然就是術語——「記憶體洩露」(或是「記憶體漏洞」)——memory leak。於是,系統的可分配記憶體會隨malloc
越來越少,直到系統崩潰。還是來看看「棧記憶體」和「堆記憶體」的差別吧。
棧記憶體分配:(典型的函式:alloca)
char*
allocstrfromstack()
堆記憶體分配:(典型的函式:
malloc
)
char* allocstrfromheap(int len)
堆記憶體分配:(典型的函式:malloc
)char* allocstrfromheap(int len)
對於第乙個函式,那塊
pstr
的內存在函式返回時就被系統釋放了。於是所返回的
char*什麼也沒有。而對於第二個函式,是從堆上分配記憶體,所以哪怕是程式退出時,也不釋放,所以第二個函式的返回的記憶體沒有問題,可以被使用。但一定要呼叫
free釋放,不然就是
memory leak!
對於第乙個函式,那塊pstr
的內存在函式返回時就被系統釋放了。於是所返回的char*什麼也沒有。而對於第二個函式,是從堆上分配記憶體,所以哪怕是程式退出時,也不釋放,所以第二個函式的返回的記憶體沒有問題,可以被使用。但一定要呼叫free釋放,不然就是memory leak!
在堆上分配記憶體很容易造成記憶體洩漏,這是
c/c++的最大的「克星」,如果你的程式要穩定,那麼就不要出現
memory leak。
剛好前一段時間有乙個
linux上的服務應用程式,大約有幾百的
c檔案編譯而成,執行測試良好,等使用時,時間一長記憶體佔用率就偏高,搞得許多人焦頭爛額,查不出問題所在。出現這種問題就是
memeryleak
在 做怪了,在
c/c++中這種問題總是會發生,所以你一定要小心。乙個
rational的檢測工作——
purify,可以幫你測試你的程式有沒有記憶體洩漏。我保證,做過許多
c/c++的工程的程式設計師,都會對
malloc
或是 new有些感冒。當你什麼時候在使用
malloc
和 new時,有一種輕度的緊張和惶恐的感覺時,你就具備了這方面的修養了。
在堆上分配記憶體很容易造成記憶體洩漏,這是c/c++的最大的「克星」,如果你的程式要穩定,那麼就不要出現memory leak。
剛好前一段時間有乙個linux上的服務應用程式,大約有幾百的c檔案編譯而成,執行測試良好,等使用時,時間一長記憶體佔用率就偏高,搞得許多人焦頭爛額,查不出問題所在。出現這種問題就是memeryleak
在做怪了,在c/c++中這種問題總是會發生,所以你一定要小心。乙個rational的檢測工作——purify,可以幫你測試你的程式有沒有記憶體洩漏。我保證,做過許多c/c++的工程的程式設計師,都會對malloc
或是new有些感冒。當你什麼時候在使用malloc
和new時,有一種輕度的緊張和惶恐的感覺時,你就具備了這方面的修養了。
對於malloc
和free的操作有以下規則:
1) 配對使用,有乙個
malloc
,就應該有乙個
free。(
c++中對應為
new和
delete)
2) 盡量在同一層上使用,不要像上面那種,
malloc
在函式中,而
free在函式外。最好在同一呼叫層上使用這兩個函式。
3) malloc
分配的記憶體一定要初始化。
free後的指標一定要設定為
null。
4) 設計自己的記憶體分配鍊錶,記載已經分配的記憶體,便於在釋放的時候有備可查
注:雖然現在的作業系統(
linux和
memory leak的記憶體,所以,最好還是你自己來做這個工作。
收藏 C語言程式記憶體分配中的堆和棧
裡說的是c語言程式記憶體分配中的堆和棧。下面先談談c語言的記憶體管理 可執行程式在儲存時 沒有調到記憶體 分為 區 text 資料區 data 和未初始化資料區 bss 3個部分。1 區 text segment 存放cpu執行的機器指令 machine instructions 通常,區是可共享的...
記憶體的堆分配和棧分配
記憶體的堆分配和棧分配 備註 這一部分非常重要,如果錯誤請及時告知。謝謝 這裡是完全參考其他部落格。c 記憶體模型 1 棧區 由編譯器自動分配和釋放,存放函式的引數數值,區域性變數的值 其操作方式類似於資料結構中的棧 2 堆區 一般由使用者分配和釋放,若使用者不釋放,程式結束時候由os 它與資料結構...
記憶體的堆分配和棧分配
c 記憶體模型 1 棧區 由編譯器自動分配和釋放,存放函式的引數數值,區域性變數的值 其操作方式類似於資料結構中得棧 2 堆區 一般由使用者分配和釋放,若使用者不釋放,程式結束時候由os 它與資料結構中堆是兩回事,分配方式類似鍊錶 3 全域性區 靜態區 static 全域性變數和靜態變數的存放區域。...