C++中的內(nèi)存分區(qū)介紹
C++的內(nèi)存劃分為棧區(qū)、堆區(qū)、全局區(qū)/靜態(tài)區(qū)、字符串常量和代碼區(qū)。
這里去掉自由存儲區(qū),增加了代碼區(qū),理由會在下面講到。
棧區(qū):由系統(tǒng)進行內(nèi)存的管理。
說明:主要存放函數(shù)的參數(shù)以及局部變量。棧區(qū)由系統(tǒng)進行內(nèi)存管理,在函數(shù)完成執(zhí)行,系統(tǒng)自行釋放棧區(qū)內(nèi)存,不需要用戶管理。整個程序的棧區(qū)的大小可以在編譯器中由用戶自行設(shè)定,默認(rèn)的棧區(qū)大小為3M。
全局/靜態(tài)區(qū):全局、靜態(tài)數(shù)據(jù)存放在一起的,初始化的全局變量和靜態(tài)變量是在一起的。未初始化的全局變量和靜態(tài)變量是在相鄰的空間中。
說明:全局變量和靜態(tài)全局變量的存儲方式是一致的,但是其區(qū)別在于,全局變量在整個源代碼中都可以使用,而靜態(tài)全局變量只能在當(dāng)前文件中有效。比如我們的一個程序有5個文件,那么某個文件中申請了靜態(tài)全局變量,這個靜態(tài)全局變量只能在當(dāng)前文件中使用,其他四個文件均不可以使用。而某個文件中申請了全局變量,那么其他四個文件中都可以使用該全局變量(只需要通過關(guān)鍵字extern申明一下就可以使用了)。事實上static改變了變量的作用范圍。
字符串常量區(qū):存放字符串常量,程序結(jié)束后,由系統(tǒng)進行釋放。比如我們定義char * p = “Hello World”; 這里的“Hello World”就是在字符串常量中,最終系統(tǒng)會自動釋放。
代碼區(qū):存放程序體的二進制代碼。比如我們寫的函數(shù),都是在代碼區(qū)的。
堆區(qū):由用戶手動申請,手動釋放。在C中使用malloc,在C++中使用new(當(dāng)然C++中也可以使用malloc)。
說明:new操作符本質(zhì)上還是使用了malloc進行內(nèi)存的申請,因此我將自由存儲區(qū)和堆區(qū)都說成堆區(qū),不過兩者還是有很大的差別。
1)malloc是C語言中的函數(shù),而new是C++中的操作符。
2)malloc申請之后返回的類型是VOID*,而new返回的指針帶有類型。
3)malloc只負(fù)責(zé)內(nèi)存的分配而不會調(diào)用類的構(gòu)造函數(shù),而new不僅會分配內(nèi)存,而且會自動調(diào)用類的構(gòu)造函數(shù)。
相關(guān)文章
適合初學(xué)者練習(xí)的C語言實現(xiàn)三子棋小游戲
今天這篇文章主要介紹給大家分享一個適合初學(xué)者練習(xí)的利用C語言寫三子棋小游戲,用簡單的C語言來實現(xiàn)小時候玩的三子棋游戲,下面是人機對戰(zhàn),當(dāng)然這個代碼的電腦對手是人工智障而不是人工智能 詳細(xì)內(nèi)容就請跟小編一起來閱讀下面文章內(nèi)容吧2021-10-10
C++實現(xiàn)獲取系統(tǒng)時間的方法小結(jié)
這篇文章主要為大家詳細(xì)介紹了使用C++實現(xiàn)獲取系統(tǒng)時間的一些常用方法,文中的示例代碼講解詳細(xì),具有一定的借鑒價值,有需要的小伙伴可以了解下2024-03-03
c++回溯法解決1到9之間插入加減或空使運算結(jié)果為100
編寫一個在1,2,…,9(順序不能變)數(shù)字之間插入+或-或什么都不插入,使得計算結(jié)果總是100的程序,并輸出所有的可能性。例如:1 + 2 + 34 – 5 + 67 – 8 + 9 = 1002021-10-10
C++17文件系統(tǒng)庫之std::filesystem 示例詳解
std::filesystem是C++17引入的一個強大且易用的文件系統(tǒng)操作庫,它提供了跨平臺的文件系統(tǒng)操作接口,簡化了文件和目錄操作的代碼實現(xiàn),本文給大家介紹C++17文件系統(tǒng)庫之std::filesystem 示例詳解,感興趣的朋友一起看看吧2025-03-03

