C 程式執行時的記憶體空間如何分割槽

2022-03-14 08:23:50 字數 1682 閱讀 7875

1樓:我才是小烏龜

c++程式的內純格局通常分為4個區:

1.資料區(data area)

2.**區(code area)

3.棧區(stack area)

4.堆區(即自由儲存區)(heap area)

全域性變數、靜態變數、常量存放在資料區,所有類成員函式和非成員函式**存放在**區,為執行函式而分配的區域性變數、函式引數、返回資料、返回地址等存放在棧區,餘下的空間為堆區。

因為堆是有限的,它可能變得擁擠,如果堆中沒有足夠的自由空間以滿足記憶體的需要時,那麼此需要失敗,並且返回一個空指標。因此,必須在使用new生成的指標之前進行檢查,方法如下:

c++**

heapclass *pa1 , *pa2;

pa1 = new heapclass(4); // 分配空間

pa2 = new heapclass (); // 分配空間

if(!pa1 || !pa2)

heapclass *pa1 , *pa2;

pa1 = new heapclass(4); // 分配空間

pa2 = new heapclass (); // 分配空間

if(!pa1 || !pa2)

一般來說,堆空間相對其他記憶體空間比較空閒,隨要隨拿,給程式執行帶來了較大的自由度,但是管理堆區是一件十分複雜的工作,頻繁地分配(new)和釋放(delete)不同大小的堆空間將會產生堆內碎塊。使用堆空間往往由於:

.直到執行時才能知道需要多少物件空間;

.不知道物件的生存期到底有多長;

.直到執行時才知道一個物件需要多少記憶體空間;

2樓:匿名使用者

在c++中,記憶體分成5個區,他們分別是堆、棧、自由儲存區、全域性/靜態儲存區和常量儲存區。

1.棧,就是那些由編譯器在需要的時候分配,在不需要的時候自動清楚的變數的儲存區。裡面的變數通常是區域性變數、函式引數等。

2. 堆,就是那些由new分配的記憶體塊,他們的釋放編譯器不去管,由我們的應用程式去控制,一般一個new就要對應一個delete。如果程式設計師沒有釋放掉,那麼在程式結束後,作業系統會自動**。

3.自由儲存區,就是那些由malloc等分配的記憶體塊,他和堆是十分相似的,不過它是用free來結束自己的生命的。

4.全域性/靜態儲存區,全域性變數和靜態變數被分配到同一塊記憶體中,在以前的c語言中,全域性變數又分為初始化的和未初始化的,在c++裡面沒有這個區分了,他們共同佔用同一塊記憶體區。

5.常量儲存區,這是一塊比較特殊的儲存區,他們裡面存放的是常量,不允許修改(當然,你要通過非正當手段也可以修改,而且方法很多)

下面哪個記憶體區域是c++中的執行時動態記憶體分配區域

3樓:青春模糊了雙眼

(1)對於堆記憶體(即動態分配的記憶體malloc, new等)的大小,最大可達4g,我在我電腦上測試(vc6.0,我記憶體512)1g左右還能看到結果,再大機器就慢死了,這只是受你機器虛記憶體和系統實體記憶體限制。不過我們程式設計的時候開闢這樣大的空間是沒有意義的,除非你有足夠牛逼的硬體機器,否則我們的個人機器都無法承受。。

(2)對於棧記憶體(常用來儲存非動態分配的全域性變數或區域性變數)在vc6.0下預設分配給的是1m位元組,不過可以調整(我現在還不會哦)。其他平臺下別人說一般認為是64k,我沒有在其他編譯器下試驗過,樓主可以試一下。

c程式執行時是不是會不停佔用新記憶體?至於記憶體

是不是正常的程式都存在佔用記憶體後就釋放記憶體?這要分情況 非動態分配的記憶體是程式在執行中一直佔用著的。動態分配的記憶體會隨著資料的變化和程式的執行在動態變化的,有時會需要很多,有時不需要,在不需要時,對已分配的記憶體是否進行釋放要看程式設計者對 的控制 一般情況下,良好的程式會對動態分配的記憶體...

閱讀程式並把程式的執行時輸出結果寫出請給詳細步驟

倒敘輸出,gninrom doog。第一個for你肯定知道是怎麼回事了,就 是把p置為str1最後一位的地址,注意這裡是地址。然後關鍵來了,第二個for。注意條件是 p str1。這個條件看上去有點奇怪,不過如果你對指標夠了解的話,還是比較簡單的。p現在是str1最後一位的地址,先 得到倒數第二位的...

怎樣釋放電腦C盤的記憶體空間?C盤上的應用可以移到其他盤嗎

魚戲蓮葉西,魚戲蓮葉南,電腦c盤的檔案能不能移到其他盤裡?可以的,是部分能移動的。一 c盤記憶體不夠的解決方法 如果是空間不夠用,可以清理磁碟,當然清理磁碟效果不會太好。然後就可以嘗試將系統的休眠檔案和虛擬記憶體檔案移動到其他的分割槽,在系統屬性 高階 效能裡面設定。或者嘗試無損擴充分割槽,可以使用...