C C 記憶體管理 筆記

2021-09-25 08:39:38 字數 1146 閱讀 8985

記憶體管理是個比較複雜的東西,我這裡記錄一些比較重要的筆記。

0.永遠保持謙虛的態度來使用指標和操作記憶體。

1.在用free釋放記憶體後,要記得將指標賦值為null,防止產生"野指標"。

2.盡量不要用指標指向常量字串。看乙個小例子:

char *p="

abcde";

p[0]='m'

;std::cout

《用gcc編譯會出現警告:warning: deprecated conversion from string constant to 『char*』.然後試著執行本程式,會出現:bus error. 

常量字串,那就必然是乙個常量,就必然不能被更改。但是如果是用指標來引用常量字串,就很容易將p指標與其他指向malloc分配的記憶體的指標混淆,造成比較難以發現的錯誤。如果必須要用常量字串,我比較喜歡放在棧中,在**中用命名來提示這是乙個常量字串,比如 char const_a="abcde";雖然這從本質上不是乙個常量字串,可能會有一些壞處,但我覺得這是解決這一點問題的方法之一。

3.我覺得指標與陣列的乙個很大的區別就是:int a[10];int *p;sizeof(a)與sizeof(p)的差別了。sizeof(a)是整個陣列的位元組數,而sizeof(p)是指標的大小,32位是4位元組,64位為8位元組。

4.函式的引數如果是乙個陣列,那麼,可以理解為陣列退化成了指標。乙個小例子:

void print(int a[10

])int

main()

輸出的值永遠是sizeof(char *)。

5.當程式結束時,會釋放所有記憶體,包括在堆中的和在棧中的,以及在靜態儲存區的。

6.free(p)。如果p是null指標,那麼free對p無論操作多少次都不會處問題。如果p不是null指標,那麼free對p連續操作兩次就會導致程式執行錯誤。

7.new和delete在處理動態物件的時候,會分別自動呼叫物件的建構函式和析構函式,而malloc/free卻沒有這樣的功能。這是因為malloc/free是庫函式而不是運算子。c++中可以通過過載運算子來為new/delete新增功能,但是卻不能改變庫函式的作用(因為編譯器沒有這樣的控制許可權)。所以在進行動態物件的記憶體管理時,應該使用new/delete而不是malloc/free.

參考資料:

c c 記憶體管理

我一直覺得記憶體是很複雜的東西.也許我把這篇文章完成的時候,我會了解一點c 的記憶體管理機制 從硬體開始 記憶體器位址空間 匯流排位址空間 cpu位址空間 虛擬記憶體位址空間 程式位址空間 邏輯位址空間 程式位址空間對c 程式設計師來說是可見的,其他位址空間我們並不關心 通過列印pointer的值 ...

C C 記憶體管理

寫乙個好的c 程式,我們要懂得好多東西,比如說最基本的物件導向程式設計思想,c 的封裝 繼承 多型機制,設計模式等,還有乙個很重要的內容便是效能優化,像c c 這種接近底層的語言,追求的就是效能,與之相關的一項內容便是記憶體管理,記憶體分配要合理,禁止破壞記憶體,不能有記憶體洩漏,操作不好的話,程式...

C C 記憶體管理

1.相同點 失敗 null 2 使用之前都要進行判斷是否為空 3 釋放空間的方式 free 4 返回值 void 可以強制型別轉換 2.不同點 1 malloc 引數 位元組數 功能 負責將空間給出 2 calloc 引數 單個元素位元組數,元素個數 功能 給出空間,且對空間進行初始化為0 若p為n...