C C 指標 陣列與記憶體管理(三)

2021-10-07 08:52:14 字數 988 閱讀 1780

關於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"

C C 指標與陣列

在二維陣列傳參時,經常遇到這樣的問題,不能將 int 轉換為 int 5 雖然二維陣列a 5 5 的a是二級指標,但是用int 是單純的二級指標,但是二維陣列的a是完全不同的。a 0 表示第一行一維陣列,a 1 表示第二行二維陣列,a是具有結構的,這一點和普通的二級指標具有很大的區別。int p 5...

C C 指標與陣列

目錄 陣列記憶體位址 指標 偏移 指標加減法 指標變數遍歷陣列 取乙個變數的位址 符號 int a 4 a取得變數a的記憶體位址 陣列是一塊連續的記憶體,型別 名字 個數 sizeof 型別 個數,連續的記憶體 區域性變數的陣列,所以這個陣列的記憶體是分配在我們的棧上的 連續的記憶體,由低位址排到高...

C C 陣列與指標

經常使用stl導致陣列與指標都陌生了,複習總結一下 c c 裡指標確實更高效了,也更複雜了 陣列的建立 type t arr name const n type t指數組的元素型別,const n指常量表示式 int arr 10 is ok陣列的初始化 int arr1 10 不進行初始化,存放未...