C 在堆上建立物件還是在棧上建立物件

2021-08-21 22:16:21 字數 1010 閱讀 4776

對於**:

object obj;

obj是在棧上分配的嘛?

其實,這個語句的含義是,使物件obj具有「自動儲存的性質」,意思就是這個物件的儲存位置取決於其宣告所在的上下文。

如果這個語句出現在函式內部,那麼它就在棧上建立物件。

如果這個語句不是在函式內部,而是作為乙個類的成員變數,則取決於這個類的物件是如何分配的。

class

class

;class *pclass = new

class;

指標pclass所指向的物件在堆上分配空間。因為object obj;語句的含義是「自動儲存」,所以,pclass->obj也是在堆上建立的。

object *pobj;

pobj = new

object;

object *pobj;代表,指標pobj是自動儲存的,僅此而已,沒有任何其它含義。而下面一行語句則指出,這個指標所指向的物件是在堆上面分配的。

至此,我們解釋了函式內部的變數和成員變數。還有兩類變數:全域性變數和static變數。它們即不在堆上建立,也不在棧上建立。它們有自己的記憶體空間,是除堆和棧以外的資料區。也就是說,當object obj即不在函式內部,又不是類的成員變數時,這個物件會在全域性資料段建立,同理適用於static變數。對於指標object *pobj;,如果這個語句出現在函式內部或類的成員變數,正如我們前面所說的,這個指標是自動儲存的。但是,如果這個語句是在類的外部,它就是在全域性資料段建立的。雖然它指向的物件可能在堆上建立,也可能在棧上建立。

但是,有些情況,即便你在棧上建立了物件,它還是會占用堆的空間。考慮如下**:

void

func

物件v是在棧上建立的。但是,stl 的vector類其實是在堆上面儲存資料的(這點可以檢視源**)。因此,只有物件v本身是在棧上的,它所管理的資料(這些資料大多數時候都會遠大於其本身的大小)還是儲存在堆上。

C 在堆上建立物件,還是在棧上?

如果需要在堆上建立物件,要麼使用new運算子,要麼使用malloc系列函式。這點沒有異議。真正有異議的是下面的 c 1 object obj 此時,obj是在棧上分配的嗎?要回答這個問題,我們首先要理解這個語句是什麼意思。這個語句就是代表著,在棧上建立物件嗎?其實,這行語句的含義是,使物件obj具有...

物件只能建立在棧上(堆上)

只能建立在棧上 禁用new操作符,變數就只能定義在棧上了,new operator首先呼叫operator new,把operator new定義為private即可 class a void operator delete public a 只能建立在堆上 不能直接呼叫析構函式,那麼就無法在棧上建...

C 堆還是棧上建立物件

如果需要在堆上建立物件,要麼使用new運算子,要麼使用malloc系列函式。這點沒有異議。真正有異議的是下面的 c 1 object obj 此時,obj是在棧上分配的嗎?要回答這個問題,我們首先要理解這個語句是什麼意思。這個語句就是代表著,在棧上建立物件嗎?其實,這行語句的含義是,使物件obj具有...