學習c++如果不了解記憶體分配是一件非常可悲的事情。而且,可以這樣講,乙個c++程式設計師無法掌握記憶體、無法了解記憶體,是不能夠成為乙個合格的c++程式設計師的。
一、記憶體基本構成
可程式設計內存在基本上分為這樣的幾大部分:靜態儲存區、堆區和棧區。他們的功能不同,對他們使用方式也就不同。
靜態儲存區:內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在。它主要存放靜態資料、全域性資料和常量。
棧區:在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束時這些儲存單元自動被釋放。棧記憶體分配運算內置於處理器的指令集中,效率很高,但是分配的記憶體容量有限。
堆區:亦稱動態記憶體分配。程式在執行的時候用malloc或new申請任意大小的記憶體,程式設計師自己負責在適當的時候用free或delete釋放記憶體。動態記憶體的生存期可以由我們決定,如果我們不釋放記憶體,程式將在最後才釋放掉動態記憶體。 但是,良好的程式設計習慣是:如果某動態記憶體不再使用,需要將其釋放掉,否則,我們認為發生了記憶體洩漏現象。
二、三者之間的區別
我們通過**段來看看對這樣的三部分記憶體需要怎樣的操作和不同,以及應該注意怎樣的地方。
例一:靜態儲存區與棧區
char* p = 「hello world1」;
char a = 「hello world2」;
p[2] =『a』;
a[2] =『a』;
char* p1 = 「hello world1;」
C 堆 棧 靜態儲存區
棧堆 靜態儲存區 生命週期 函式結束即釋放 new,malloc開闢,delete,free釋放 釋放前,一直存在 最長,程式退出才釋放 儲存型別 程式 區域性變數 new,malloc申請的空間,用於儲存資料 常量static 修飾的變數,用於儲存資料 大小vs2010預設1m vs2010,x3...
c語言儲存區 堆疊靜態儲存區
棧 由編譯器自動分配釋放,其中存放在主調函式中被呼叫函式的下一句 函式引數和區域性變數,容量有限 堆由程式設計師自己分配釋放 用malloc和free,或new和delete 如果我們不手動釋放,那就要到程式結束才釋放。如果對分配的空間在不用的時候不釋放而一味的分配,那麼可能會引起記憶體洩漏,其容量...
堆疊靜態儲存區
1 從靜態儲存區域分配 內存在程式編譯時就已經分配好,這塊內存在程式的整個執行期間都存在。速度快 不容易出錯,因為有系統會善後。例如全域性變數,static變數等。靜態變數分為區域性靜態變數和全域性靜態變數,注意區分,區域性靜態變數不是全域性變數 靜態全域性變數的作用域僅限於當前原始檔,靜態區域性變...