C++中局部變量和全局變量的存儲位置和內存回收機制

局部變量,參數變量存放在棧中,當離開作用範圍後,分配的內存在作用範圍外會被系統自動回收。

切記!不要使用局部變量的指針和引用!

在函數結束後,局部變量被釋放後,指針和引用可能在短時間內可以使用,也可能會立即失效。因爲在指針和引用所指向和代表的

內存一旦被重新分配就會導致該指針和引用會立即失去原本想要存儲的值,出現嚴重的語義錯誤。

 

要想確保返回的引用或者指針是正確的,不妨提問:引用所引的對象或指針所指的對象是在函數之前已經存在的哪個對象?

 

new出來的內存空間存放在堆中,不受作用域管理,不會被系統自動回收,只有在使用delete刪除或者整個程序結束後纔會釋放內存。

因此很容易發生忘記delete而造成內存泄漏事件。例如在某個函數中定義有:

A* a=new A();

則指針a在函數運行完畢後將銷燬,但是new出來的內存並不會被銷燬,需要執行delete a;才能被銷燬。

此外static變量,全局變量的有效期都是整個程序運行期。

而智能指針的出現則是在指針被銷燬的情況下,也會銷燬指針指向的內存,避免內存泄漏發生。

這是一種常見的內存泄露的情況。儘量避免手動管理指針,採用c++11中的shared_ptr和unique_ptr來管理。


但是有一種情況可以使用局部變量的引用,就是可以在f函數中調用g函數的時候,使用局部變量b作爲函數f中調用g函數的引用形

參b。

因爲這裏與函數的遞歸類似,在A函數沒有結束之前,它的調用棧還沒用被釋放就在其中又調用了一個B函數,並且在這個B函數

中使用了A函數中的臨時變量的引用,這樣就不會出現在使用這個引用的時候,出現混亂的現象,是可以的。
 

int f(int &a){

    int b=a-1;

    g(b);

}
int g(int &b){

    cout<<b;

}

同時,若在函數A中直接對B函數調用,並且B這個函數的形參使用該臨時變量的一個計算值即一個右值傳遞給這個形參,需要使

這個形參設置爲const。因爲右值即將銷燬,表達式求值過程中創建的臨時變量。即以下情形。

int f(int &a){

    g(b-1);

}
int g(const int &b){

    cout<<b;

}

定義全局變量

使用全局變量
先在定義全局變量的.h文件中使用extern int g_i;定義全局變量
再在要使用全局變量的.cpp文件中包含該.h文件,對該全局變量定義一下,在最外層定義int g_i;
其他cpp若要使用該全局變量,只需要也包含該.h文件。
需要注意的是隻能定義一次,第一次在最外層定義了全局變量後不能再定義。

發佈了63 篇原創文章 · 獲贊 71 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章