C++的內存劃分爲棧區、堆區、全局區/靜態區、字符串常量和代碼區。函數
這裏去掉自由存儲區,增長了代碼區,理由會在下面講到。指針
棧區:由系統進行內存的管理。內存
說明:主要存放函數的參數以及局部變量。棧區由系統進行內存管理,在函數完成執行,系統自行釋放棧區內存,不須要用戶管理。整個程序的棧區的大小能夠在編譯器中由用戶自行設定,默認的棧區大小爲3M。字符串
全局/靜態區:全局、靜態數據存放在一塊兒的,初始化的全局變量和靜態變量是在一塊兒的。未初始化的全局變量和靜態變量是在相鄰的空間中。編譯器
說明:全局變量和靜態全局變量的存儲方式是一致的,可是其區別在於,全局變量在整個源代碼中均可以使用,而靜態全局變量只能在當前文件中有效。好比咱們的一個程序有5個文件,那麼某個文件中申請了靜態全局變量,這個靜態全局變量只能在當前文件中使用,其餘四個文件均不可使用。而某個文件中申請了全局變量,那麼其餘四個文件中均可以使用該全局變量(只須要經過關鍵字extern申明一下就可使用了)。事實上static改變了變量的做用範圍。內存管理
字符串常量區:存放字符串常量,程序結束後,由系統進行釋放。好比咱們定義char * p = 「Hello World」; 這裏的「Hello World」就是在字符串常量中,最終系統會自動釋放。編譯
代碼區:存放程序體的二進制代碼。好比咱們寫的函數,都是在代碼區的。變量
堆區:由用戶手動申請,手動釋放。在C中使用malloc,在C++中使用new(固然C++中也可使用malloc)。構造函數
說明:new操做符本質上仍是使用了malloc進行內存的申請,所以我將自由存儲區和堆區都說成堆區,不過二者仍是有很大的差異。二進制
1)malloc是C語言中的函數,而new是C++中的操做符。
2)malloc申請以後返回的類型是VOID*,而new返回的指針帶有類型。
3)malloc只負責內存的分配而不會調用類的構造函數,而new不只會分配內存,並且會自動調用類的構造函數。