示例C語言程式記憶體管理

2021-04-08 18:11:38 字數 1365 閱讀 6992

我們知道 記憶體分配方式有三種:

(1) 從靜態儲存區域分配。內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在。例如全域性變數,static變數。

(2) 在棧上建立。在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束時這些儲存單元自動被釋放。棧記憶體分配運算內置於處理器的指令集中,效率很高,但是分配的記憶體容量有限。

(3) 從堆上分配,亦稱動態記憶體分配。程式在執行的時候用malloc或new申請任意多少的記憶體,程式設計師自己負責在何時用free或delete釋放記憶體。

#include "stdio.h"

#include "string.h"

class a

void print()

protected:

char *m_sza;

};class t

void addfora(a &a)

protected:

char m_szt[32];

};void main()

上面程式定義了a類它有乙個字串指標變數,注意是指標,不隨構造分配空間;可以呼叫add方法為

它的符串指標賦值。print是它的列印函式。

另外定義了t類,它是a的友元類,t有乙個字串變數,注意是陣列型,隨構造分配空間並且構造為

this is t string字串,addfora是在t中為a的指標變數m_sza賦值。

在主程式中首先建立了t的指標物件pt並申請好內堆記憶體空間,另外宣告一a的變數a,a是函式的區域性變數,

它的生存週期是到主函式退出為止,接下去呼叫pt的addfora方法,並立刻釋放pt資源,當列印a時發現成功

輸出了this static string,可以證明它並沒有隨pt的釋放而不復存在,因為static變數符合1的分配原則,它的生

命週期至程式退出為止。

假若將addfora改為

void addfora(a &a)

會怎樣呢?

你將發現不管是a.paint在pt釋放之前列印還是之後列印,結果都是亂碼。這是因為temp是函式區域性變數,生命

週期隨函式執開始至執行結束。

假若將addfora改為

void addfora(a &a)

會怎樣呢?

結果是如果a.print在delete pt之前呼叫會成功列印 this is t string,反之輸出亂碼。這是因為程式主動結束了m_szt所指向物件的生命。

假若將addfora改為

void addfora(a &a)

會怎樣呢?

我們發現可以成功列印this is const string。這是因為常量也是放在靜態儲存區的,它的生命週期與static變數一致。

以上僅為個人一點學習心得。歡迎交流討論。

C 語言動態記憶體管理介紹和示例

在c 程式中,所有記憶體需求都是在程式執行之前通過定義所需的變數來確定的。但是可能存在程式的記憶體需求只能在執行時確定的情況。在這些情況下,程式需要動態分配記憶體,c 語言將運算子new和delete合成在一起。中通過new關鍵字進行動態記憶體申請。c 中的動態記憶體分配是基於資料型別進行的。del...

c語言記憶體管理

在c語言中,根據資料在記憶體中存在的時間 生存期 不同,將記憶體空間分為三個區 1.程式區 用於儲存程式的 即程式的二進位制 存放函式體的二進位制 2.靜態儲存區 用於儲存全域性變數和靜態變數,這些變數的空間在程式編譯時就已經分配好了.全域性變數和靜態變數的儲存是放在一塊的,初始化的全域性變數和靜態...

C語言 記憶體管理

對於任何的作業系統來說,記憶體都是很寶貴的乙個地方。所以,對於程式語言來說,記憶體管理就顯得尤為重要。c語言 在記憶體中執行的時候,我們大致將占用的記憶體分為4塊區域 區 靜態區 棧區 堆區。這4各區域,有著各自的特點,他們也儲存著我們的程式在執行中的不同型別的資料。弄明白了這4個區域的資料儲存特點...