Una malloc che ritorna NULL e' un sintomo di un problema ben piu' rognoso: un memory leak.
Ed e' questo da risolvere.
Intanto eliminiamo subito il caso in cui l'applicazione alloca troppa memoria fin dalla sua partenza: questo caso viene risolto gia' in fase di sviluppo.
Il caso rognoso e' quando il memory leak e' lento: ci possono volere ore o giorni per iniziare a vedere degli effetti (troppa memoria allocata dall'applicazione, ma ancora inferiore alla memoria disponibile nel sistema)
Ma andiamo con ordine: perche' una malloc ritorna NULL? Perche' non ha piu' memoria disponibile.
Ma come funziona una malloc?
A grandi linee funziona cosi':
1) l'applicazione parte con una certa quantita' di memoria assegnata dal SO.
2) l'applicazione inizia a fare le sue elaborazioni e vengono chiamate le malloc. Quando una malloc non ha piu' memoria disponibile tra quella assegnata, richiede al S.O. un nuovo blocco di memoria.
3) questo processo continua finche' il S.O. ha a disposzione memoria libera.
4) quando l'applicazione ha allocata sutta la memoria di sistema, e il S.O non ne ha piu', ritorna NULL.
Ma a questo punto tutto il compiuter e' in uno stato disastroso: oltre alla tua applicazione, ci sono anche altre applicazioni che stanno girando, che richiedono e rilasciano memoria in continuazione, c'e' il S.O. il buffer a supporto della lettura/scrittura file, la gestione della memoria virtuale, i thread, i servizi di rete, l'interfaccia grafica, ...
In questo stato, non e' solo la tua applicazione che non funziona, ma l'intero sistema: puo' non funzionare piu' l'interfaccia grafica, non puoi piu' lanciare una console, il traffico di rete si ferma per mancanza di risorse,...
Se la macchina e' accessibile solo da remoto, potrebbe non essere piu' raggiungibile..
Spesso l'unica soluzione in tali situazioni e' quella di spegnere e riaccentere il computer.
Allora che si fa?
L'approccio standard, in attesa di capire dove sta' il memory leak e' quello di aggiungere un controllo, all'interno dell'applicazione, che si assicura che l'applicazione stessa non allochi piu' di tot memoria, superata la quale la quale l'aplicazione viene abortita e si sfruttano i dei meccanismi automatici di riavvio.
In C c'e' la possibilita' anche di impostare un handler per gestire la situazione di "out of memory", ma spesso la sua attivazione arriva troppo tardi, percche' intanto il sistema e' gia' diventato instabile.
Quindi, il passo successivo e' cercare di capire il responsabile del memory leak.
Raramente si trova in 5 minuti. Spesso e' subdolo e serve fare un sacco di tentativi, aggiungendo controlli su controlli in vari punti del codice, per capire dove si trova il responsabile.
E' un lavoro lento e' complicato: e spesso richiede l'utilzzo di strumenti come i memory profiler che sono anche loro abbastanza complicati da utilizzare: si deve conoscere esattamente come funziona l'applicazione, tutte le sue componenti, ...
Un lavoraccio
Ora e' un po' piu' chiaro?