(五十九)自動儲存 靜態儲存 動態儲存

2021-09-23 23:29:36 字數 1716 閱讀 2494

自動儲存:

函式內部定義的常規變數,被稱為自動變數,這意味著他們在所屬的函式被呼叫的時候自動產生,在該函式結束時消亡。

自動變數是乙個區域性變數,作用域為包含他的**塊,比如int main(){}中定義的int a; 在int abc(){}這個函式中就不能用。

自動變數通常儲存在 棧 中,這意味著執行**塊時,其中的變數將依次加入到 棧 中,而離開**塊時,將按相反的順序釋放這些變數,這被稱為後進先出(lifo),因此,在程式執行的過程中,棧將不斷的增大和縮小。

靜態儲存:

靜態儲存是整個程式執行期間都存在的儲存方式。使變數成為靜態的方式有兩種:

①在函式外面定義他,比如:

#include using namespace std;

int a = 1;

int main()

②在宣告變數的時候,使用static;如**:

static

int a = 1;

當使用static的時候,能使得函式在呼叫之後,再次呼叫的時候,static限定的值能保持在上次呼叫之後,函式的值。如**:

#include using namespace std;

void ab();

int main()

void ab()

輸出:

呼叫ab函式的時候顯示a的值:1

a +1 =2

呼叫ab函式的時候顯示a的值:2

a +1 =3

請按任意鍵繼續. . .

我們發現,第一次執行函式ab()的時候,輸出a的值是1,然後在執行函式的時候,a=a+1,於是a=2

當第二次執行函式的時候,a並不是值為1,而是保持了第一次呼叫函式ab()退出時變數a的值,即a=2。

這是static來限定函式內變數的特點,保持函式變數在退出時的值。

動態儲存和記憶體洩露:

new和delete運算子提供了比靜態變數和自動變數更智慧型的儲存方式。

他們管理了乙個記憶體池,這在c++被稱為自由儲存空間(free store)或堆

(heap),該記憶體池與 用於 靜態儲存 和 動態儲存 的記憶體是分開的。

使用new在堆 上面建立變數,然後再使用delete進行刪除,可以避免記憶體洩露。如果單純使用new,而沒使用delete,那麼將會導致new的記憶體位址被占用,在整個程式週期之內,就無法再次使用這部分記憶體了。在極嚴重的情況下,很可能導致記憶體被全部用盡,於是程式崩潰。例如**:

#includechar *getname(void);	

using namespace std;

int main()

system("pause");

return 0;

}char*getname()

因為在getname()函式中,new了2次。在main函式中new了一次,並delete了一次。

首先,main函式中的delete了main函式中new的,

又由於getname()函式中的指標c和main中的指標a相同,於是相當於又delete了乙個getname()函式中的指標,但還存在乙個指標b沒有被刪除,這個時候,只有刪除了指標b,才可以避免導致記憶體洩露。

C 筆記 自動儲存 靜態儲存和動態儲存

c 有3中管理資料記憶體的方式 自動儲存 靜態儲存和動態儲存,以這三種方式分配的資料物件各不相同。自動儲存。在函式內部定義的常規變數使用自動儲存空間,稱為自動變數,他們在所屬的函式被呼叫時自動產生,在該函式結束時消亡。自動變數是乙個區域性變數,其作用域為包含它的 塊。自動變數通常儲存在棧中。在執行 ...

靜態儲存與動態儲存

靜態儲存變數通常是在變數定義時就分定儲存單元並一直保持不變,直至整個程式結束。5.5.1節中介紹的全域性變數即屬於此類儲存方式。動態儲存變數是在程式執行過程中,使用它時才分配儲存單元,使用完畢立即釋放。典型的例子是函式的形式引數,在函式定義時並不給形參分配儲存單元,只是在函式被呼叫時,才予以分配,呼...

C 靜態儲存,動態儲存

什麼是靜態儲存,動態儲存 靜態儲存變數通常是在變數定義時就分定儲存單元並一直保持不變,直至整個程式結束。動態儲存變數是在程式執行過程中,使用它時才分配儲存單元,使用完畢立即釋放。典型的例子是函式的形式引數,在函式定義時並不給形參分配儲存單元,只是在函式被呼叫時,才予以分配,呼叫函式完畢立即釋放。如果...