正確的C++記憶體分區

來源:互聯網
上載者:User

前置:作為一個C++的菜鳥,一直對C++的記憶體分區比較暈乎,網路上的分配方式各式各樣,讓人看得雲裡霧裡。網路上有一種分區,將C++記憶體分為:堆區、棧區、自由儲存區、全域/靜態儲存區和常量儲存區。個人認為這是完全錯誤的記憶體劃分方式,誤導我這樣的菜鳥。鑒於此,我尋找資料,整理出以下的結論。

真正合理的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不僅會分配記憶體,而且會自動調用類的建構函式。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.