我正在C++中開發具有有限內存(Tegra 2)的嵌入式系統的應用程序。我在整個有時會發生的代碼中處理NULL結果new
和new[]
,但應用程序能夠處理這個問題。SIGKILL同時在C++中分配內存
問題是如果內存完全耗盡,系統會通過SIGKILL殺死進程。我能不知何故告知new
應該返回NULL而不是殺死進程?
我正在C++中開發具有有限內存(Tegra 2)的嵌入式系統的應用程序。我在整個有時會發生的代碼中處理NULL結果new
和new[]
,但應用程序能夠處理這個問題。SIGKILL同時在C++中分配內存
問題是如果內存完全耗盡,系統會通過SIGKILL殺死進程。我能不知何故告知new
應該返回NULL而不是殺死進程?
我不確定你正在使用什麼樣的操作系統,但你應該檢查它是否支持 opportunistic memory allocation像Linux一樣。
如果啓用,可能出現以下情況:
new
或malloc
從內核得到一個有效的地址。 即使內存不足,因爲...解決方案:內存禁用造成過度: echo 2 > /proc/sys/vm/overcommit_memory
想到兩個想法。
1.)編寫自己的內存分配函數,而不是直接取決於new
。你提到你在嵌入式系統上,其中特殊的分配器在應用程序中很常見。您是直接在硬件上運行應用程序,還是在執行/操作系統層下的進程中運行?如果是後者,是否提供了用於分配內存的系統API?
2.)檢查C++ set_new_handler
,看看它是否可以幫助你。當new
分配失敗時,您可以請求調用特殊功能。也許在這個函數中,你可以採取行動來阻止任何正在執行的進程。參考:http://www.cplusplus.com/reference/std/new/set_new_handler/
add 1)是的,這是一種如何解決它的方法,但是如果可能存在基於系統配置的解決方案,我就懶得這樣做了。它是開放的嵌入式分佈,與「真正的」嵌入式系統相比,非常重量。我不知道是否有任何特殊內存分配的API。任何提示? 加2)偉大的洞察力,我會嘗試。 – Blackhex 2012-08-02 14:17:07
我不知道,但你可以嘗試使用「新的(拋出異常)」 http://www.cplusplus.com/reference/std/ new/nothrow/ – 2012-08-02 14:02:12
我在大多數情況下都會這樣做,當然我在分配更大的內存時也是如此。在某些情況下,我懶得重寫new(std :: nothrow),但我想這個進程會以異常而不是SIGKILL結束。 – Blackhex 2012-08-02 14:06:31