C'è la necessità di verificare NULL dopo l'allocazione di memoria, quando kernel utilizza il sovraccarico di memoria

StackOverflow https://stackoverflow.com/questions/2248995

  •  20-09-2019
  •  | 
  •  

Domanda

È una pratica generale, per verificare la presenza di NULL (se la memoria è correttamente allocato) dopo una malloc(), qualche cosa come

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

con memoria overcommit abilitato nel kernel, c'è una possibilità di ottenere NULL?Dovrei seguire la pratica di religiosamente controllo NULL per ogni allocazione?Sarà malloc restituisce NULL nonostante aggressivo overcommit meccanismo (credo che il valore 1)?

Infatti kernel Android utilizza la memoria overcommit (non sono sicuro valore, piacerebbe conoscere(overcommit valore) e il suo significato).Alcuni dei framework di origine(C/C++) codice di Android (che potrebbe essere anche di 3 ° parti) non controlla NULL, né prendere bad_alloc dopo l'assegnazione.Mi manca qualcosa?

Ci sono alcuni thread in MODO per quanto riguarda l'overcommit della memoria, ma nessuno di loro risolto la mia confusione.

EDIT: Se aggressivo overcommit è stato impiegato NULL non sarà restituito(ipotesi 1).Quando non c'è memoria fisica disponibile e sul tentativo di accedere alla memoria allocata (scrivere in memoria allocata), OOM volontà di uccidere un po ' di processo e alloca la memoria per l'applicazione fino a che non ottiene ucciso a sua volta(ipotesi 2).In entrambi i casi non vedo alcun bisogno per il vostro arrivo NULL (che la memoria diventi assegnati o processo di essere ucciso).io sono di diritto nella mia ipotesi?
La portabilità non è un problema per questa domanda.

È stato utile?

Soluzione

Sì, si dovrebbe comunque verificare la presenza di errori restituiti da malloc.In un ambiente che overcommits memoria non sarà in grado di rilevare e correggere gli errori dovuti all'ambiente in esecuzione di spazio fisico richiesto quando si scrive per le parti di spazio di indirizzi che sono stati stanziati per il programma da una precedente chiamata a malloc.

Tuttavia, questo non è l'unico problema che potrebbe causare un malloc funziona in un ambiente tradizionale.Una richiesta per un grande blocco di memoria quando lo spazio degli indirizzi del tuo programma ha frammentato può fallire, anche se potenzialmente ci sia abbastanza memoria fisica totale per soddisfare la richiesta.Perché non c'è intervallo contiguo di spazio libero indirizzo malloc deve fallire.Questo tipo di guasto deve essere segnalato da malloc di ritorno NULL, e se l'ambiente è della memoria.

Altri suggerimenti

È necessario controllare il valore restituito è NULL ogni tempo.Qualsiasi funzione di libreria può fallire.Anche fclose() do (su scollegato condivisione NFS, e l'errore fclose di file NFS significa che i dati non salvati).

La maggior parte del software è scritto male e non contiene tutti i controlli.

malloc non può tornare a qualcosa di diverso da NULL o puntatore.O tutto o niente.Non è possibile ottenere 1 byte da malloc se chiedi 10.

Sarebbe opportuno verificare la presenza di NULL religiosamente attraverso tutte le chiamate di funzioni che possono restituire NULL, indipendentemente dal fatto che il kernel è stato vincolante memoria o non.

Il seguente segmento di codice di seguito viene illustrato come controllare se la chiamata a malloc ha funzionato o non...

void *ptr = malloc(10);
if (ptr != NULL){
   /* Do something here with ptr */
}else{
   /* Do something here if it fails */
}

Le operazioni sui File, le operazioni di memoria per citarne alcuni, verrà restituito un valore NULL in caso di errore.

Spero che questo aiuta, I migliori saluti, Tom.

beh...su Linux poiché la memoria è non la pagina eseguito (inizialmente) e solo crea pagina di supporto dopo la prima lettura/scrittura, il sistema operativo sarà sempre riesce a dare memoria (a meno che non hai esaurito lo spazio di indirizzi, qualcosa che non è possibile in sistemi a 64 bit).Quindi, se si esaurisce la memoria e in grado di dare la promessa di memoria, OOM killer sarà solo uccidere la vostra applicazione o qualche altra applicazione per dare a voi la pagina di supporto di cui avete bisogno.Quindi, se si esegue il controllo di NULL o non, viene fuori è lo stesso, un crash.......

No, non c'è bisogno di controllare il risultato della malloc.

A lungo prima di malloc verrebbe a mancare, il sistema operativo ha già incontrato un sacco di problemi.

"OOM-Killer e overcommit" sarebbe una scelta migliore.

Cosa????Il sistema operativo non supporta "OOM-Killer e overcommit"?

Questo è il motivo per cui si dovrebbe passare a Linux (o Android)!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top