2012-08-02 62 views
8

我正在C++中開發具有有限內存(Tegra 2)的嵌入式系統的應用程序。我在整個有時會發生的代碼中處理NULL結果newnew[],但應用程序能夠處理這個問題。SIGKILL同時在C++中分配內存

問題是如果內存完全耗盡,系統會通過SIGKILL殺死進程。我能不知何故告知new應該返回NULL而不是殺死進程?

+1

我不知道,但你可以嘗試使用「新的(拋出異常)」 http://www.cplusplus.com/reference/std/ new/nothrow/ – 2012-08-02 14:02:12

+0

我在大多數情況下都會這樣做,當然我在分配更大的內存時也是如此。在某些情況下,我懶得重寫new(std :: nothrow),但我想這個進程會以異常而不是SIGKILL結束。 – Blackhex 2012-08-02 14:06:31

回答

11

我不確定你正在使用什麼樣的操作系統,但你應該檢查它是否支持 opportunistic memory allocation像Linux一樣。

如果啓用,可能出現以下情況:

  1. newmalloc從內核得到一個有效的地址。 即使內存不足,因爲...
  2. 內核直到第一次訪問的時刻才真正分配內存。
  3. 如果使用了所有「過度使用」內存,則操作系統沒有機會殺死其中一個涉及的進程。 (告訴程序沒有足夠的內存太遲了。)在Linux中,這叫做Out Of Memory Kill (OOM Kill)。這種殺死會被記錄在內核消息緩衝區中。

解決方案:內存禁用造成過度: echo 2 > /proc/sys/vm/overcommit_memory

1

想到兩個想法。

1.)編寫自己的內存分配函數,而不是直接取決於new。你提到你在嵌入式系統上,其中特殊的分配器在應用程序中很常見。您是直接在硬件上運行應用程序,還是在執行/操作系統層下的進程中運行?如果是後者,是否提供了用於分配內存的系統API?

2.)檢查C++ set_new_handler,看看它是否可以幫助你。當new分配失敗時,您可以請求調用特殊功能。也許在這個函數中,你可以採取行動來阻止任何正在執行的進程。參考:http://www.cplusplus.com/reference/std/new/set_new_handler/

+0

add 1)是的,這是一種如何解決它的方法,但是如果可能存在基於系統配置的解決方案,我就懶得這樣做了。它是開放的嵌入式分佈,與「真正的」嵌入式系統相比,非常重量。我不知道是否有任何特殊內存分配的API。任何提示? 加2)偉大的洞察力,我會嘗試。 – Blackhex 2012-08-02 14:17:07