引用:楊麗慧 的 c++記憶體分配的五種方法
也不知道是不是她,當初我拷貝這篇文章時沒注意作者是誰,現在需要引用,特意找了一下,如果不對,請指正。
正文:在c++中,記憶體分成5個區,他們分別是堆、棧、自由儲存區、全域性/靜態儲存區和常量儲存區。
棧,就是那些由編譯器在需要的時候分配,在不需要的時候自動清楚的變數的儲存區。裡面的變數通常是區域性變數、函式引數等。
堆,就是那些由new分配的記憶體塊,他們的釋放編譯器不去管,由我們的應用程式去控制,一般乙個new就要對應乙個delete。如果程式設計師沒有釋放掉,那麼在程式結束後,作業系統會自動**。
自由儲存區,就是那些由malloc等分配的記憶體塊,他和堆是十分相似的,不過它是用free來結束自己的生命的。
全域性/靜態儲存區,全域性變數和靜態變數被分配到同一塊記憶體中,在以前的c語言中,全域性變數又分為初始化的和未初始化的,在c++裡面沒有這個區分了,他們共同占用同一塊記憶體區。
常量儲存區,這是一塊比較特殊的儲存區,他們裡面存放的是常量,不允許修改。
驗證程式:
測試:#include
using namespace std;
const int abc =125;
const int abcd = 125;
int abc1 = 12;
int abc2 = 12;
void text(int **p1,int **p2)
int main()
結果:stack text:0xbfac1c7c 0xbfac1c78
static text:0x804a04c 0x804a050
const test:134516012 134516012
stack main:0xbfac1cb4 0xbfac1cb0
static main:0x804a044 0x804a048
const main:134516012 134516012
heap text:0x89a5008 0x89a5018
help main:0x89a5028 0x89a5038
const:0x8048d94 0x8048d98
global0x804a03c 0x804a040
問題1:需要4b,堆給我分配了16b?
問題2:靜態變數儲存如何實現?
問題3: const int 算不算常量?
記憶體何時釋放問題: 棧:
#include
using namespace std;
char* text()
int main()
int main()
int main()
int main()
{char *p=text();
cout《全域性變數略分析
略結論:
好像只有棧在函式返回時釋放,全域性區,靜態區,常量區,堆都不釋放....
C 記憶體分配
總結 1 從靜態儲存區域分配。內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在。例如全域性變數,static變數。2 在棧上建立。在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束時這些儲存單元自動被釋放。棧記憶體分配運算內置於處理器的指令集中,效率很高,但是...
C 記憶體分配
c 中的記憶體主要分為五塊 全域性區 static 存放全域性變數或靜態變數 常量區 const 存放常量,不允許修改 可以通過特殊手段修改 堆 heap 由使用者自行分配和釋放,在程式執行時分配。由malloc分配,由free釋放 自由儲存區 free store 由new分配,由delete釋放...
C 記憶體分配
在c 中,記憶體分成4個區,他們分別是堆,棧,靜態儲存區和常量儲存區 1 棧,就是那些由編譯器在需要的時候分配,在不需要的時候自動清除的變數的儲存區.裡面的變數通常是區域性變數,函式引數等.2 堆,又叫自由儲存區,它是在程式執行的過程中動態分配的,它最大的特性就是動.態性.由new分配的記憶體塊,他...