Comment gérer le realloc quand il échoue en raison de la mémoire?

Question dit tout cela, mais voici un exemple:

typedef struct mutable_t{
    int count, max;
    void **data;
} mutable_t;


void pushMutable(mutable_t *m, void *object)
{
    if(m->count == m->max){
        m->max *= 2;
        m->data = realloc(m->data, m->max * sizeof(void*));
    }
    //how to handle oom??
    m->data[m->count++] = object;
}

Comment puis-je gérer à court de mémoire et pas NULL toutes mes données?

edit - nous allons supposer qu'il y a quelque chose qui pourrait être fait par exemple de libérer de la mémoire quelque part, ou au moins de dire à l'utilisateur "vous ne pouvez pas le faire - que vous êtes hors de la mémoire". Idéalement, je voudrais quitter ce qui a été alloué.

dépend fortement de l'application... mais une chose est sûre, un OOM est assez critique.
connexes: stackoverflow.com/questions/1941323/...
Juste pour ajouter quelques réponses ici, une idée de comment gérer l'échec d'une realloc() (dans votre cas) serait de faire m->max /= 4; m->max *= 3; et essayez de l'appeler realloc() à nouveau pour voir si nous pouvons encore nous serrer un peu plus d'octets. Vous pouvez même essayer une couple de fois avec, successivement, de plus petites tailles, mais à un certain point, il ne sera pas la peine.
if (!m->data) { log("s'il vous Plaît mettre à niveau vers la version 64 bits"); abort(); }

OriginalL'auteur Nick Van Brunt | 2009-12-31