關於C/C++的內存管理,博主發現一篇博文已經總結的很好了。內存管理
這裏做幾點總結:
(1)函數體內的局部變量保存在棧上, 但棧的內存容量有限,在Linux下可以使用ulimit -s查看棧的內存容量。在程序中注意不要超過這個值。當相應的範圍結束時,局部變量就不能在使用。
(2)使用malloc/new等動態內存分配函數,內存從堆上獲得。
(3)動態內存的生存週期可以由自己決定,但問題也多。使用完畢後一定要使用free/delete函數將申請的內存釋放,並將指針指向NULL,避免產生野指針。
(4)程序中頻繁使用malloc/new等動態內存分配函數,容易產生內存碎片,對程序穩定性產生不利影響。
(5)malloc/new申請的一定是一塊連續的內存,申請的內存可能比實際申請的大,也可能申請不到。最好分配之後判斷一下是不是爲NULL
(6)使用free等釋放指針時,一定要傳遞指針起始地址,否則將導致申請的部分內存不能被釋放,這個稱爲內存泄漏
(7)使用malloc內存申請成功後,最好使用memset函數對申請的內存清零
(8)野指針,野指針是指指針變量沒有被初始化,指針變量free後沒有指向NULL,指針操作超越了變量的作用範圍,內存越界等。野指針的出現是非常危險的。
(9)禁止釋放或函數內返回非動態申請的內存(棧中的內存,函數中的局部變量等)
(10)使用malloc/new等方式動態分配內存,速度一般比較慢。
由上可知,不合理的使用指針造成的後果將是非常危險的。但某些情況下使用指針也將帶來極大的便利,在c語言中也有很多情況不得不使用指針,不能因噎廢食,就是使用指針時一定要小心小心再小心。在c++中,我們可以使用引用運算符、string類型等方式儘量避免使用指針。
c++ string類型簡介
string類定義隱藏了字符串的數組性質,string類能夠自動處理字符串的大小,而不用擔心數組太大導致內存浪費或者太小導致數組越界。
string類的初始化:
string test = "hello world"