Je potřeba zkontrolovat NULL po přidělování paměti, když jádro používá overcommit paměť

hlasů
25

Je běžnou praxí zkontrolovat NULL (ať už paměti je úspěšně přiděleno) po malloc (), některé věci jako

void *ptr = malloc(10);    
if (ptr != NULL) {  
  // do some thing usefull  
} else {  
 // no memory. safely return/throw ...  
}  

se zapnutým paměti overcommit v jádře, je tu šance na získání NULL? Měl jsem držet se praxe nábožensky kontrolu NULL pro každý přidělení? Bude malloc vrátit NULL Navzdory agresivní overcommit mechanismu (myslím, že hodnota 1)?

Jako ve skutečnosti jádra Android používá paměťové overcommit (nejsem si jistý o hodnotě, rád bych ji (overcommit veličina) a její význam vědět). Některé z rámcového zdroje (C / C ++) kódu v Android (může být třetí stranou) nekontroluje NULL ani záchytné bad_alloc po přidělení. Uniká mi něco?

Tam jsou některé závity v tom, pokud jde o paměti overcommit, ale žádný z nich vyřešit můj zmatek.

EDIT: Pokud agresivní overcommit je zaměstnán NULL zvyklý být vrácena (předpoklad 1). Když není k dispozici, a na pokusu o přístup k přidělené paměti (zápis do paměti přidělené) žádná fyzická paměť, bude OOM zabít nějaký proces a přiděluje paměť pro aplikace až se dostane zabit v pořadí (předpoklad 2). V každém případě nevidím žádnou potřebu cheking NULL (paměť dostat přiděleno nebo proces někdo zabil). mám pravdu ve svých předpokladech?
Přenositelnost není starost o tuto otázku.

Položena 12/02/2010 v 02:09
zdroj uživatelem
V jiných jazycích...                            


5 odpovědí

hlasů
37

Ano, měli byste ještě zkontrolovat selhání vráceny malloc. V prostředí, které overcommits paměť nebude schopen detekovat a zotavit se z neúspěchů vzhledem k životnímu prostředí vyčerpání fyzického úložiště požadované při zápisu do částí adresového prostoru, které byly přiděleny do svého programu předchozí volání malloc.

Nicméně, toto není jediný problém, který by způsobit mallocselhání v tradičním prostředí. Žádost o mimořádně velký blok paměti při adresový prostor vašeho programu stala roztříštěné může selhat iv případě, že je potenciálně dostatek celkové fyzické paměti k uspokojení požadavku. Protože neexistuje žádná souvislá řada volného adresového prostoru mallocmusí selhat. Tento druh poruchy, musí být signalizována mallocnávratem NULL, zda je či není prostředí overcommitting paměti.

Odpovězeno 17/02/2010 v 12:56
zdroj uživatelem

hlasů
8

Je nutné zkontrolovat návratovou hodnotu NULL každé době. Jakékoli funkce knihovny může selhat. Dokonce fclose () dělat (na odpojeném NFS sdílet, a omylů z fclose z NFS souborových prostředků, že data nebyla uložena).

Nejvíce software je špatně napsaný a neobsahuje všechny kontroly.

malloc nemůže vrátit něco jiného než NULL nebo ukazatel. Všechno nebo nic. Nemůžete získat 1 byte z malloc, pokud se zeptáte na 10 let.

Odpovězeno 15/02/2010 v 16:01
zdroj uživatelem

hlasů
2

Bylo by vhodné zkontrolovat NULL nábožensky napříč všemi funkcemi volání, které může vrátit NULL, bez ohledu na to, zda je jádro má více než-committable paměti či nikoliv.

Tato následující segment kódu níže ukazuje, jak zkontrolovat, zda je volání mallocpracoval, nebo ne ...

void * ptr = malloc (10);
if (ptr! = NULL) {
   / * Něco tady s PTR * /
}jiný{
   / * Udělejte něco tady, pokud selže * /
}

Souborové operace, operace v paměti, aby jmenovali jen několik vrátí NULL při selhání.

Doufám, že to pomůže, S pozdravem, Tome.

Odpovězeno 16/02/2010 v 21:34
zdroj uživatelem

hlasů
0

no ... na Linuxu, protože paměť není stránka zálohovány (zpočátku) a pouze vytvoří strana podkladu po prvním čtení / zápis, operační systém bude vždy podaří, aby vám paměť (pokud jste vyčerpaný adresní prostor, něco, co není možné v 64bitových systémech ). Takže pokud se vyčerpá paměť a nemůže dát slíbené paměť, bude OOM zabiják prostě zabít svou aplikaci nebo jinou aplikaci, aby vám stránky podporu, kterou potřebujete. Takže ať už dělat kontrolu NULL nebo ne, se přijde stejná, ke zhroucení .......

Odpovězeno 24/04/2018 v 04:37
zdroj uživatelem

hlasů
-5

Ne, není třeba kontrolovat výsledek malloc.

Dlouho předtím, než malloc selže, operační systém již narazil na spoustu problémů.

Odpovězeno 17/07/2012 v 15:52
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more