C++中棧和堆的區別及區分對象存儲在堆或棧中的方法

剛開始學習C++,記錄下點點滴滴,同時也分享下

棧:

函數內局部變量的存儲單元都可以在棧上創建,函數執行結束時這些存儲單元自動被釋放,棧內分配運算內置於處理器的指令集中,效率高,但是分配的內存容量有限。

堆:

又稱爲動態內存分配,程序在運行的時候用new申請任意多少的內存,由程序員自己負責在何時用delete釋放內存。動態內存的生存週期由我們決定,使用靈活,但是問題也比較多。


剛開始學習C++,感覺會有很多人和我一樣,可能明白堆和棧的區別,也能明白簡單情況下對象是存儲在堆中還是棧中,複雜的就有可能分不清了。

網上沒有查到直接獲取對象存儲在堆中還是棧中的方法,下面提供一個思路,供大家參考

int main()
{
	int *i = new int(5);
	int *j = new int(6);
	int a = 5;
	int b = 6;
	cout << "i指向的地址:"<<i << endl;
	cout << "j指向的地址:"<<j << endl;
	cout << "a的地址:"<<&a << endl;
	cout << "b的地址:"<<&b << endl;
	
	delete i;
	return 0;
}

輸出結果是









我們通過存儲的地址來判斷對象存儲在堆還是棧上,理論依據是:堆是向高地址位擴展,而棧是向低地址位擴展。

指針i指向的對象地址要低於j指向的地址,是向高地址位擴展,所以指針i,j指向的對象存儲在堆中。而a,b的地址可以看出,是向低地址位擴展,所以a,b是存儲在棧中。

細心的朋友可以發現,我代碼中有用到了delete i,這裏也是有用的,因爲這是第2種判斷對象存儲位置的方法。指針只能指向堆中對象,不能指向棧中對象,可以用指針指向要判斷的對象,然後用delete關鍵字刪除指針指向的對象,如果程序崩潰,說明不能刪除,對象是存儲在棧中的。反之對象是存儲在堆中。爲什麼會這樣,因爲棧的釋放是不能由我們控制的,是自動釋放,人爲干涉就會使程序崩潰。

剛剛開始學習,不知道理解的對不對,希望大家指正




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章