1. 程式人生 > >C++中不同型別物件的存放位置

C++中不同型別物件的存放位置

C++中不同型別物件的存放位置

在C++中,定義的物件被放在不同的區域中,以下就各個區域以及不同型別物件的儲存情況作簡要介紹。

1. 儲存區域

棧(Stack)是存在於作用域(scope)的一塊記憶體空間。
例如當你呼叫函式時,函式本身就會形成一個棧用來放置它所接收的引數,以及返回地址。
堆(Heap 或 system heap)是指由作業系統提供的一塊記憶體空間。


程式可以從其中動態分配獲得若干區塊。
全域性儲存區(靜態儲存區)是作業系統提供的一塊記憶體區間。

2. 不同型別物件的儲存

下面先給出一段程式碼:

class A{
public:
	A(){ cout << "A的建構函式" << endl; }
	~A(){ cout << "A的解構函式" << endl; }
};
class B{
public:
	B(){ cout << "B的建構函式" << endl; }
	~B(){ cout << "B的解構函式" << endl;
} }; class C{ public: C(){ cout << "C的建構函式" << endl; } ~C(){ cout << "C的解構函式" << endl; } }; class D{ public: D(){ cout << "D的建構函式" << endl; } ~D(){ cout << "D的解構函式" << endl; } }; void fun(){ B b; //區域性物件 static C c; //靜態區域性物件 D *d = new D; //動態物件 delete d;
cout << "程式結束" << endl; } A a; //全域性物件 int main(){ fun(); cout << "主程式結束" << endl; return 0; }

輸出結果如下:
輸出結果

2.1 全域性物件

全域性物件(global object),其生命在程式結束之時才結束。
全域性物件和靜態區域性物件存放在全域性儲存區(靜態儲存區),初始化的全域性物件和靜態區域性物件在一塊區域, 未初始化的全域性物件和未初始化的靜態區域性物件在相鄰的另一塊區域。程式結束後由系統釋放。
程式中的 a 就是一個全域性物件,可以看出,程式開始時,它最先被構造,而當整個程式結束之際才被析構。

2.2 區域性物件

區域性物件(stack object 或 auto object),其生命在作用域結束時結束,它的解構函式會自動被呼叫,即物件自動被清理。
很顯然,區域性物件存放在棧中。
程式中的 b 就是一個區域性物件,在 fun() 函式中被構造,在 fun() 函式結束的時候被析構。

2.3 靜態區域性物件

靜態區域性物件(static local object),其生命在作用域結束之後仍然存在,即此時物件的解構函式並不會被呼叫,直到整個程式結束。
程式中的 c 就是一個靜態區域性物件,在 fun() 函式中被構造,而當整個程式結束之際才被析構。

2.4 動態物件

動態物件(heap object),其生命在它被 delete 之際結束。
動態物件存放在堆中,而用於建立動態物件的指標存放在棧中。
程式中的指標 d 就是用來建立動態物件的,在 new 的時候被構造,而在 delete 的時候被析構。
注:new 的物件,必須使用 delete 去顯式的呼叫解構函式,否則程式不會去呼叫其解構函式,從而造成記憶體洩露。記憶體洩漏的原因是,在 fun() 函式中被動態構造的指標 d ,在 fun() 函式結束時刻結束生命,而其指向的空間並沒有被釋放,這塊記憶體很可能失去了程式的控制,程式結束之後被交還給作業系統。