溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++對象在堆棧區(qū)的析構(gòu)是怎樣的

發(fā)布時間:2021-11-30 15:56:31 來源:億速云 閱讀:133 作者:iii 欄目:編程語言

這篇文章主要介紹“C++對象在堆棧區(qū)的析構(gòu)是怎樣的”,在日常操作中,相信很多人在C++對象在堆棧區(qū)的析構(gòu)是怎樣的問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”C++對象在堆棧區(qū)的析構(gòu)是怎樣的”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

作為一個C++程序員,區(qū)別于其他面向?qū)ο笳Z言其中最敏感的就是對new(malloc)和delete(free)這兩個關鍵字了。

今天在閱讀老大的代碼的時候,在COM對象的重復賦值的時候發(fā)現(xiàn)在對一個vector重新分配的insert新元素的時候,沒有先clear掉。自己以前在用STL的容器的時候總是在開頭和***調(diào)用clear,但是進過實驗和調(diào)試之后發(fā)現(xiàn),含有vector的對象在析構(gòu)的時候就是不做vector.clear()的話,vector中的元素也能析構(gòu)。

后來稍微一想,就發(fā)現(xiàn)自己之前的想法是多愚蠢,STL的容器都是C++對象,既然是對象肯定會在自己的析構(gòu)函數(shù)中做一些清理,如果連這些都沒有的話,那STL也不會發(fā)展成C++***的一個庫了。

由此又想到了很多,vector在clear到底干了什么,從匯編的角度來說,在棧上的一切變量都是不會導致內(nèi)存泄露的,那么vector是否真的不用去調(diào)用clear呢?錯,vector的元素肯定不會是建立在棧上的,而是建立在堆上的。為什么,建立在棧上的數(shù)組大小肯定是在編譯時候就確定的,為什么?想到了在學校時候的一個非常典型的例子:

int x;  scanf("%d", &x);  char ch[x];

試圖通過輸入一個數(shù)字來分配對象的x個字符,這是不行的,為什么?當時老師只說這是在編譯時期確定的,不能動態(tài)確定,只能寫成

int x;  scanf("%d", &x);  char* ch = new char[x];

這已經(jīng)是分配在堆上了,以后再運行期動態(tài)確定。那到底為什么棧上的空間不能在運行期動態(tài)確定呢?從匯編的角度來理解就容易多了:棧上能夠移動的元素總是在棧頂?shù)?,無非就是Push,Pop

char ch[x];  int i,j;

試想一下,面對這樣的動態(tài)分配,該怎樣生成指令來制定棧的建立呢,由于在建立棧的時候每一個指令在棧中需要占用的大小,堆中就不一樣了,堆中內(nèi)存可以是不連續(xù)的,不用遵循FILO的棧原則,所以是相當靈活的。

現(xiàn)在來看為什么STL的容器都是建立在堆上的,STL的容器往往都是可以調(diào)整大小的,試問建立在棧上的元素,如何能保證它在任何時候都能調(diào)整大小呢,除非在任何時候都能保證它在棧頂,顯然這是不現(xiàn)實的!

到此,關于“C++對象在堆棧區(qū)的析構(gòu)是怎樣的”的學習就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關知識,請繼續(xù)關注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

c++
AI