我們知道 記憶體分配方式有三種:
(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個區域的資料儲存特點...