回答
堆棧是內存量有限,而且與如果你從來沒有清理任何內存分配系統,它會簡單地成長和壯大。最終你會溢出堆棧,並且當你覆蓋其他內存區域或者簡單地生成無效地址時,所有地獄都會崩潰。
給定的執行線程只有一定數量的堆棧。
它的目的是暫時保存一個函數被調用時所需的數據(比如返回地址和傳遞給函數的參數)。
如果你這樣做而不是當你的函數退出時清理堆棧,你將最終用完堆棧空間。另外,作爲超越堆棧的一般規則,應該儘可能縮短程序使用的任何資源(堆棧空間,堆空間,文件句柄等)以提高整體效率。
如果你沒有清理堆棧,調用函數將如何找到它的變量?被調用者將運行,使用自己的變量在堆棧上執行一些操作,然後返回調用者 - 現在,如果堆棧指針發生更改,調用者可以做些什麼?它如何恢復它以找出它自己的堆棧變量在哪裏?唯一的答案是清理堆棧 - 不管它是誰(被調用者或調用者),但有人必須。
術語「內存泄漏」通常是指失去了指向一個動態內存分配,讓你不能free()
該分配。
除了其他的答案,我使用的大多數處理器都將函數調用的返回地址放在堆棧上。
的RET/RTS(或任何回報,如果使用您的處理器語法)簡單地從堆棧中的返回地址,並設置PC,ProgramCounter,到該地址。
如果函數將在堆棧上額外的變量,但不刪除它們,則RET將會重新拉開大錯誤值,並且將返回的地址不正確造成的種種古怪行爲,或例外/陷阱。
故障引起的這種行爲會變得很難調試,特別是如果他們沒有過錯immediatley
軟件程序(函數)可以共享堆棧獲取調用的參數和返回變量以及記憶呼叫者的返回地址。
由於程序集中的堆棧指針通常是一個寄存器,它是一種全局變量。如果在函數結束時,堆棧指針沒有設置到合適的位置(「堆棧清理」),則會發生很多不好的事情。系統可能返回錯誤的地址,調用者可能彈出錯誤的返回值,可能會出現堆棧溢出,下溢等。
@artjomb。在完成20個更改請求後,我很難找到那個鏈接中不那麼好的東西。我有一些明顯的拒絕,但有些是測試。你的元信息是否準確? – Fuhrmanator 2016-03-27 18:17:13
@ArtjomB。感謝您的鏈接。我瞭解到代碼更改是不允許的(合理),並且語法改進是主觀的!復活節快樂。 – Fuhrmanator 2016-03-27 18:34:46
記錄這個討論有什麼不對? – Fuhrmanator 2016-03-30 22:41:47
每個功能可能會使用堆棧,即使一些不你會得到的函數嵌套在程序中一個()調用調用兩個()兩個調用的三()等
所以,如果一個函數具有本地變量A,B,C在堆棧上,然後它調用兩個,兩個有兩個變量,它使用堆棧中的E和F.然後三個在堆疊上有G和H.如果你沒有將堆棧指針恢復到三個進入時的位置,當你返回到兩個時,它會認爲它正在訪問E和F,但將訪問G和H或其他的東西,這取決於三個堆棧幀()函數。
你不會得到內存泄漏,你會崩潰。有時候你很幸運並存活下來,這可能是這些函數代碼的本質,但總的來說,它會導致編譯後的代碼失敗。
現在它是內存泄漏如從某種意義上說,一個功能是搗毀某人elm ram,當然。
對於使用堆棧作爲返回值的處理器,情況會變得更糟,崩潰或奇怪行爲會更有保證,更糟糕。
- 1. 爲什麼我們要在堆棧和堆上管理結構
- 2. 爲什麼我們必須綜合?
- 3. 爲什麼堆棧必須進行頁面對齊?
- 4. 爲什麼許多GUI CObjects(即CButton)必須放在堆上,而不是堆棧?
- 5. 啓用會話 - 我們必須自己清理它們嗎?
- 6. 爲什麼我們必須爲@SuppressWarnings(「unchecked」)使用中間變量?
- 7. 堆棧爲空...爲什麼?
- 8. 爲什麼我必須在這裏清除std :: stringstream?
- 9. 爲什麼我們在Java中使用堆棧和隊列?
- 10. Lua堆棧清理(C API)
- 11. 爲什麼我必須定期清理Eclipse中的一個特定項目?
- 12. 什麼是堆棧用於?他們爲什麼使用C++?
- 13. Python,爲什麼我們必須繼承'列表'類
- 14. 爲什麼我們必須同時符合UIViewController和UITableViewDataSource?
- 15. 爲什麼我們必須使用$ this-> operator? | PHP
- 16. SWIFT:爲什麼我們必須將驚歎號放在:str.characters.index(of:「」)!
- 17. 爲什麼我們必須命名接口方法參數?
- 18. 爲什麼我們必須將克隆分配給新變量?
- 19. 爲什麼我們必須提供boost :: get的參數類型?
- 20. 爲什麼我們必須在hadoop中使用多個節點?
- 21. 爲什麼我們必須在'INSERT ALL'之後做出SELECT?
- 22. 爲什麼我們必須寫頭緩存控制?
- 23. 何時以及爲什麼我們必須實現Comparable接口?
- 24. 當我們要使用用戶輸入時,爲什麼我們必須清除ax註冊表?
- 25. 爲什麼我們必須顯式傳遞常量到多處理函數中?
- 26. 爲什麼堆棧有界?
- 27. 爲什麼我必須逃脫最終]
- 28. 爲什麼我必須刪除[close_out out_channel]?
- 29. 爲什麼我必須聲明var = Class.new?
- 30. 爲什麼我必須使用-lstdC++ fs?
「內存泄漏」通常是指丟失指針,因爲堆棧實際上總是被清除(編譯器強制執行)。如果它仍然由用戶來清理堆棧(就像使用程序集一樣),實際上也可能會泄漏堆棧內存,實際上我們會談到「堆棧內存泄漏」和「堆內存泄漏」。 – 2012-03-23 20:46:27