簡體   English   中英

如果我的應用內存不足怎么辦?

[英]What happens if my app is out of memory?

如果我的應用程序內存不足,當我調用new()時,我將獲得異常,而malloc()將獲得0指針。

但是,如果我調用帶有局部變量的方法怎么辦? 它們也占用內存。 有什么方法可以為“普通”變量保留內存嗎? 這樣即使new()拋出異常,我也可以捕獲它,修復問題並像往常一樣調用方法。

您的數據通過以下三種方式之一分配:

  • 靜態分配的數據(靜態成員或全局變量)在應用程序啟動時分配,這意味着它們並不是真正的問題。
  • 堆棧分配的數據分配在堆棧上(驚奇!)。堆棧是為局部變量和函數堆棧幀預留的內存區域。 如果空間用完了,將無法確定會發生什么。 一些實現可能會檢測到它,並給您訪問沖突/分段錯誤,而其他實現只會使您覆蓋堆數據。 在任何情況下,都無法檢測到此情況,因為通常沒有辦法處理它。 如果堆棧空間不足,則無能為力。 您甚至不能調用函數,因為這會占用堆棧空間。
  • 堆分配的內存是您在調用new / malloc時使用的內存。 在這里,您可以檢測到內存不足的情況,因為您可以處理它。 (而不是分配200mb,您也許可以使用100mb,而只需在中途交換數據)

但是,除非執行一些繁重的遞歸操作,否則通常不應該用完堆棧空間。

C ++語言不提供任何用於為局​​部變量保留內存的機制。 您的特定C ++實現和/或操作系統可以提供一些增加總堆棧大小的方法,但這通常不是必需的。

還要注意,如果對new的調用確實失敗了,從恢復中恢復實際上幾乎沒有什么可做的。 許多人(包括我在內)不再費心檢查新的故障。

New從堆中分配內存,但是本地var通常在堆棧上-可能會溢出,但可能性較小,具體取決於您的平台。 您能否提供更多詳細信息?

編譯器知道每個堆棧需要多少內存。 但是,足夠多的堆棧(由於遞歸導致)將使程序崩潰—可能沒有其他方法可以解決此問題。

該標准有一個有趣的附件,稱為“ 實施數量” 這是非規范性的(信息性的),因此不應將其視為絕對真理,而應為您提供一個公正的想法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM