函式返回區域性變數的指標或引用

2021-08-20 01:35:12 字數 785 閱讀 5702

一般來說,由於在離開函式後區域性變數會被釋放,所以是不允許函式返回指向區域性變數的指標或引用的。我們往往需要遵循如下原則:

引用作為返回值,必須遵守以下規則:

(1)不能返回區域性變數的引用。主要原因是區域性變數會在函式返回後被銷毀,因此被返回的引用就成為了"無所指"的引用,程式會進入未知狀態。

(2)不能返回函式內部new分配的記憶體的引用。雖然不存在區域性變數的被動銷毀問題,可對於這種情況(返回函式內部new分配記憶體的引用),又面臨其它尷尬局面。例如,被函式返回的引用只是作為一 個臨時變數出現,而沒有被賦予乙個實際的變數,那麼這個引用所指向的空間(由new分配)就無法釋放,造成memory leak。

(3)可以返回類成員的引用,但最好是const。主要原因是當物件的屬性是與某種業務規則(business rule)相關聯的時候,其賦值常常與某些其它屬性或者物件的狀態有關,因此有必要將賦值操作封裝在乙個業務規則當中。如果其它物件可以獲得該屬性的非常 量引用(或指標),那麼對該屬性的單純賦值就會破壞業務規則的完整性。 

但在有些時候,卻允許返回區域性變數的引用。其方法就是把區域性變數宣告為區域性靜態變數。如:

int& fun(void){

static int a;

return a;

}

else if(condition2) }

注:靜態變數 表示在程式生存期會被保留下來到下次修改這個變數 有相當於全域性變數的意義 ;

區域性變數 表示在程式生存期會隨著定義的作用域而消亡的變數 通常都是過度變數;

返回指向區域性變數的指標或引用

返回區域性變數沒問題 如果返回區域性變數有問題,函式的意義還有嗎?全域性變數還用返回嗎?返回指向區域性變數的指標才有問題 函式退棧之後,區域性變數消失,指標將指向未知區域,所以出現問題。返回區域性變數的引用也是絕對不可以的 引用只是變數的乙個別名,變數本體都不存在了,引用當然也沒有任何意義。還有,如...

函式返回區域性變數

一般的來說,函式是可以返回區域性變數的。區域性變數的作用域只在函式內部,在函式返回後,區域性變數的記憶體已經釋放了。因此,如果函式返回的是區域性變數的值,不涉及位址,程式不會出錯。但是如果返回的是區域性變數的位址 指標 的話,程式執行後會出錯。因為函式只是把指標複製後返回了,但是指標指向的內容已經被...

函式返回區域性變數

函式返回區域性變數 一般的來說,函式是可以返回區域性變數的。區域性變數的作用域 只在函式內部,在函式返回後,區域性變數的記憶體已經釋放了。因此,如果函式返回的是區域性變數的值,不涉及位址,程式不會出錯。但是如果返回的是區域性變數的位址 指標 的話,程式執行後會出錯。因為 函式只是把指標複製後返回了,...