C 記憶體分配思考

2021-08-31 02:44:20 字數 1437 閱讀 5362

引用:楊麗慧 的 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分配的記憶體塊,他...