Il est d'usage de vérifier la présence de NULL (si la mémoire a été allouée avec succès) après un malloc(), quelque chose comme
void *ptr = malloc(10);
if (ptr != NULL) {
// do some thing usefull
} else {
// no memory. safely return/throw ...
}
avec l'overcommit mémoire activé dans le noyau, y a-t-il une chance d'obtenir NULL ? Dois-je suivre la pratique de vérifier religieusement NULL pour chaque allocation ? Est-ce que malloc retournera NULL malgré le mécanisme d'overcommit agressif (je suppose la valeur 1) ?
En fait, le noyau Android utilise l'overcommit de mémoire (je ne suis pas sûr de la valeur, j'aimerais bien la connaître (valeur de l'overcommit) et sa signification). Une partie du code source (C/C++) du framework Android (qui pourrait être une tierce partie) ne vérifie pas la présence de NULL et n'attrape pas bad_alloc après les allocations. Est-ce qu'il me manque quelque chose ?
Il y a quelques fils de discussion dans SO concernant la mémoire overcommit, mais aucun d'entre eux n'a résolu ma confusion.
EDIT : Si l'overcommit agressif est utilisé, NULL ne sera pas retourné (hypothèse 1). Quand il n'y a pas de mémoire physique disponible et que l'on essaie d'accéder à la mémoire allouée (écrire dans la mémoire allouée), l'OOM va tuer un processus et allouer de la mémoire pour l'application jusqu'à ce qu'elle soit tuée à son tour (hypothèse 2). Dans les deux cas, je ne vois pas la nécessité de vérifier NULL (mémoire allouée ou processus tué). Est-ce que j'ai raison dans mes hypothèses ?
La portabilité n'est pas une préoccupation pour cette question.