自動儲存:
函式內部定義的常規變數,被稱為自動變數,這意味著他們在所屬的函式被呼叫的時候自動產生,在該函式結束時消亡。
自動變數是乙個區域性變數,作用域為包含他的**塊,比如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 靜態儲存,動態儲存
什麼是靜態儲存,動態儲存 靜態儲存變數通常是在變數定義時就分定儲存單元並一直保持不變,直至整個程式結束。動態儲存變數是在程式執行過程中,使用它時才分配儲存單元,使用完畢立即釋放。典型的例子是函式的形式引數,在函式定義時並不給形參分配儲存單元,只是在函式被呼叫時,才予以分配,呼叫函式完畢立即釋放。如果...