Dans mon cas de soft embarqué, ça prend la forme d'un buffer statique de quelques centaines d'octets qui est disponible pour pouvoir écrire un message de log dedans, puis l'envoyer sur le port série (le tout pouvant donc se faire sans une seule allocation supplémentaire). Il me semble qu'on peut faire le même genre de chose dans un soft normal (préallouer tout ce qu'il y a besoin avant de faire quoi que ce soit d'autre).
Dans un langage plus haut niveau, c'est au runtime du langage de se débrouiller pour faire ce genre de choses. Avec éventuellement un endroit ou "brancher" du code utilisateur (en interceptant une exception, par exemple). La stratégie de pré-allocation des ressources nécessaires au traitement de l'erreur s'applique là aussi: l'exception elle-même doit être pré allouée, ainsi que tout ce dont aura besoin le code qui va la traiter.
En C, tu as au moins de la place sur la pile. Donc si malloc échoue, tu peux aussi faire ta gestion d'erreur à base de alloca() si elle a besoin de mémoire.
[^] # Re: Exceptions
Posté par pulkomandy (site web personnel, Mastodon) . En réponse au journal Gestion des erreurs d’allocation mémoire en C. Évalué à 10.
Le mieux c'est de prévoir le coup dès le début.
Dans mon cas de soft embarqué, ça prend la forme d'un buffer statique de quelques centaines d'octets qui est disponible pour pouvoir écrire un message de log dedans, puis l'envoyer sur le port série (le tout pouvant donc se faire sans une seule allocation supplémentaire). Il me semble qu'on peut faire le même genre de chose dans un soft normal (préallouer tout ce qu'il y a besoin avant de faire quoi que ce soit d'autre).
Dans un langage plus haut niveau, c'est au runtime du langage de se débrouiller pour faire ce genre de choses. Avec éventuellement un endroit ou "brancher" du code utilisateur (en interceptant une exception, par exemple). La stratégie de pré-allocation des ressources nécessaires au traitement de l'erreur s'applique là aussi: l'exception elle-même doit être pré allouée, ainsi que tout ce dont aura besoin le code qui va la traiter.
En C, tu as au moins de la place sur la pile. Donc si malloc échoue, tu peux aussi faire ta gestion d'erreur à base de alloca() si elle a besoin de mémoire.