關於棧的析構問題

2022-08-30 23:57:32 字數 1427 閱讀 8393

關於棧這個問題我自己理解的比較抽象,其實我之前也寫過,在c中我們可以把棧區看成是cpu,下面我將它與作業系統的部分理論結合起來講解好了,倘若我們把每個模組(即函式)看成是就緒狀態,也就是說,我們寫出**就是已經準備執行的狀態,但是倘若我們不進行編譯的話,也就是說不給它分配記憶體空間(cpu),這樣的話,是不會產生結果的。

當我們點選編譯時,開始往cpu中匯入資料也就是開始分配資源,要注意的是匯入的資料並不是我們寫的**,而是我們通過**所操縱記憶體空間的操作,也就是對於資源的操作,正如同當我們生成.exe檔案後可以直接執行,然後這個時候的程式可以稱為程序了,然後就有了程序控制塊pcb,可以理解為每個程序執行時都分配了記憶體空間(資源),然後通過pcb來控制這些資源,也就是說乙個程序執行完了之後我們不再使用它了,如果不釋放它,它就會一直占用資源,造成了資源浪費,這對於一些大型工程來說是很要命的;所以在程序執行完了之後,要進行資源釋放,棧的釋放(析構)就是這個原理(大概是這樣吧!);

其實這正如同我們平時點選應用圖示一樣,這個應用圖示就是乙個介面,然後把應用所需資源匯入cpu;

然後我們的問題就來了,棧的析構到底是什麼樣的,其實在前面我已經說過了,所以這裡我稍微說的詳細一點;

1 #include 2 #include 

3 #include 4

5void citeconstants(int a);//

形參為普通常量67

void citepointer(int *a);//

形參為指標89

void

main()

1021

22void citeconstants(int a)//

形參為普通常量

2327

28void citepointer(int *a)//

形參為指標

在這裡我們可以看見,當我們呼叫乙個函式時會新開闢乙個不同於main函式的棧區,也就是他們是不相干的兩塊空間了,也就是說無法通過普通變數改變main裡的值,但是指標卻可以,因為指標裡儲存的是位址,它直接操作main函式裡的記憶體空間;

通過上面的圖我們可以看出來由函式所分配的棧空間,就像基礎資料型別一樣分配的記憶體空間,那麼也就是說這個棧是有首位址的,說到這裡估計都明白了,函式體其實也是一種資料型別,而函式名就是找到這個位址的介面,或者說門牌號。

那麼這麼一來,我們就引出了函式指標,因為既然它有位址,自然就可以用乙個指標來指向它了,然後通過指標來操作它的記憶體空間,所以說繞到了最後,還是位址,或者說指標的問題;

其實這析構一點在c++中的析構函式中可以充分的體現出來,以後要是寫c++的話我會再詳細寫的;

至於函式體括號裡的引數,它們其實和寫在函式體裡面是一樣的,只不過是有對外的屬性(即可以通過外界資源改變引數的值),也就是說函式體被析構是,他們會一同被析構掉;

析構的問題

關於以下 哪個說法是正確的?1 2 3 4 5 6 7 8 myclass foo void func 正確答案 b 你的答案 c 錯誤 a它會引起棧溢位 b都不正確 c它不能編譯 d它會引起段錯誤 在類的成員函式中能不能呼叫delete this?答案是肯定的,能呼叫,而且很多老一點的庫都有這種 ...

關於析構函式

q1 析構函式是幹什麼的?a1 析構函式用來釋放物件所分配的資源。舉例來說,lock 類可能鎖定了乙個訊號量,那麼析構函式將釋放該訊號量。最常見的例子是,當建構函式中使用了new,那麼析構函式則使用delete。q2 物件的析構順序?a2 與建構函式相反,先構造的後析構。如 乙個物件陣列構造順序是0...

虛析構函式與非虛析構函式問題!

class a class b public a int main 這種情況下,輸出結果我們都知道,是先執行子類的析構函式,後執行父類的析構函式,所以輸出是 b 和 a class a class b public a int main 這種情況下,我是記住了,析構函式在執行的時候,只有乙個執行,但...