C++程式設計經驗-返回區域性變數的討論
返回區域性變數沒問題 如果返回區域性變數有問題,函式的意義還有嗎? 全域性變數還用返回嗎?
返回指向區域性變數的指標才有問題, 函式退棧之後,區域性變數消失, 指標將指向未知區域,所以出現問題。
返回區域性變數的引用也是絕對不可以的。 引用只是變數的一個別名,變數本體都不存在了,引用當然也沒有任何意義。
還有,如果是堆空間,可以返回,即在函式中用new申請的空間,是可以返回的。
但是一般的情況下,好的風格是:
儘量在同一個作用域內成對使用new 和delete,(也即不要返回堆空間),因為如果不是這樣,會是你的函式的介面變的不夠靈活, 試想每個呼叫你的函式的人還需要記得去delete掉你在函式中new的堆空間, 否則就會造成記憶體洩露。
還有,如果是堆空間,可以返回,即在函式中用new申請的空間,是可以返回的。
但是一般的情況下,好的風格是:
儘量在同一個作用域內成對使用new 和delete,(也即不要返回堆空間),因為如果不是這樣,會是你的函式的介面變的不夠靈活, 試想每個呼叫你的函式的人還需要記得去delete掉你在函式中new的堆空間, 否則就會造成記憶體洩露。
返回啥其實都是值拷貝! 指標就是指標值拷貝, 不會拷貝被指向的內容。
永遠不要從函式中返回區域性自動變數的地址。如果你真的需要這樣操作。你可以在函式的參數列中傳入一個指標變數。然後將需要寫入的資料寫入到該指標變數指向的地址。由於該指標指向的變數,作用域在函式體 之外。因此不會在函式結束結束時被回收。
在C語言中為什麼說絕不能返回函式內區域性變數的地址?
在程式中,只在特定的過程或函式中可以訪問的變數,是相對與全域性變數而言的。
全域性變數也稱為外部變數,是在函式的外部定義的,它的作用域為從變數定義處開始,到本程式檔案的末尾。全域性變數全部存放在靜態儲存區,在程式開始執行時給全域性變數分配儲存區,程式行完畢就釋放。
區域性變數可以和全域性變數重名,但是區域性變數會遮蔽全域性變數。在函式內引用這個變數時,會用到同名的區域性變數,而不會用到全域性變數。
區域性變數的特點是:隨函式呼叫時建立 隨函式結束時析構(銷燬)。 設想,如果返回了一個區域性變數的指標,而恰好區域性變數偏偏又在函式結束後銷燬,但指標並沒有被銷燬,而是被返回,那也就是說,指標指向的正是一個被銷燬了的物件。
一般的來說,函式是可以返回區域性變數的。 區域性變數的作用域只在函式內部,在函式返回後,區域性變數的記憶體已經釋放了。因此,如果函式返回的是區域性變數的值,不涉及地址,程式不會出錯。但是如果返回的是區域性變數的地址(指標)的話,程式執行後會出錯。因為函式只是把指標複製後返回了,但是指標指向的內容已經被釋放了,這樣指標指向的內容就是不可預料的內容,呼叫就會出錯。準確的來說,函式不能通過返回指向棧記憶體的指標(注意這裡指的是棧,返回指向堆記憶體的指標是可以的)。 下面以函式返回區域性變數的指標舉幾個典型的例子來說明: 1:
2:
3:
區域性變數也分區域性自動變數和區域性靜態變數,由於a返回的是值,因此返回一個區域性變數是可以的,無論自動還是靜態, 因為這時候返回的是這個區域性變數的值,但不應該返回指向區域性自動變數的指標,因為函式呼叫結束後該區域性自動變數 被拋棄,這個指標指向一個不再存在的物件,是無意義的。但可以返回指向區域性靜態變數的指標,因為靜態變數的生存 期從定義起到程式結束。 4:如果函式的返回值非要是一個區域性變數的地址,那麼該區域性變數一定要申明為static型別。如下:
6:返回指向堆記憶體的指標是可以的
|
相關文章
- Just for fun——C/C++函式返回區域性變數的問題C++函式變數
- 函式不能返回區域性指標變數函式指標變數
- 酒店房間和 C++ 區域性變數的作用域C++變數
- C#隱式型別區域性變數經驗總結C#型別變數
- 全域性變數與區域性變數變數
- C語言區域性變數、全域性變數、靜態區域性變數、靜態全域性變數C語言變數
- javascript中的作用域(全域性變數和區域性變數)JavaScript變數
- Java區域性變數與全域性變數Java變數
- java 全域性變數和區域性變數Java變數
- JavaScript —— 區域性變數和全域性變數JavaScript變數
- jmeter全域性變數和區域性變數JMeter變數
- 【c】全域性變數與區域性變數變數
- 成員變數和區域性變數的區別變數
- C#7.0--引用返回值和引用區域性變數C#變數
- 函式之定義及全域性變數&區域性變數&風溼理論函式變數
- python全域性變數與區域性變數Python變數
- Python中的全域性變數和區域性變數Python變數
- js-js的全域性變數和區域性變數JS變數
- 成員變數和區域性變數變數
- JavaScript五:全域性變數&區域性變數;運算子JavaScript變數
- python全域性變數和區域性變數, globalPython變數
- Python的區域性變數和全域性變數使用解惑Python變數
- Python的全域性和區域性變數Python變數
- Python中類變數、成員變數、區域性變數的區別Python變數
- 成員變數、全域性變數、例項變數、類變數、靜態變數和區域性變數的區別變數
- 程式程式碼,常量,區域性變數,全域性變數在記憶體中的儲存位置變數記憶體
- iOS 靜變數static、全域性變數extern、區域性變數、例項變數iOS變數
- Python全域性變數與區域性變數詳解Python變數
- 詳解python 區域性變數與全域性變數Python變數
- 記一個全域性變數"冒充"區域性變數引起的bug變數
- Java基礎-成員變數和區域性變數的區別Java變數
- test函式中的區域性變數函式變數
- Android中全域性變數與區域性變數的使用總結Android變數
- 區域性變數和全域性變數(靜態和非靜態)區別變數
- javascript的函式的引數是區域性變數JavaScript函式變數
- 【Java貓說】例項變數與區域性變數Java變數
- C++程式設計基礎(2)變數C++程式設計變數
- 十二、變數作用域:區域性變數、全域性變數,函式版名片管理系統—新增函式文件變數函式