Que faites-vous lorsque malloc
retourne 0 ou une nouvelle exception de lancers? Arrêter ou essayer de survivre à la condition de MOO / enregistrer le travail de l'utilisateur?
9
Que faites-vous lorsque malloc
retourne 0 ou une nouvelle exception de lancers? Arrêter ou essayer de survivre à la condition de MOO / enregistrer le travail de l'utilisateur?
Réponses:
J'éviterais le MOO comme éviter un crash.
Évitez de faire un gros morceau de travail (et allouez un gros morceau de mémoire) à la fois. Conservez les données sur le disque, faites confiance au cache de disque du système d'exploitation et utilisez autant que possible les E / S mappées en mémoire, et n'utilisez qu'une petite partie des données à la fois. Si de grandes quantités de données doivent être en ligne (servies avec une faible latence), gardez-les en mémoire sur plusieurs machines, comme le font toutes les grandes sociétés de moteurs de recherche. Ou achetez un SSD.
la source
La plupart des personnes qui répondent à cette question n'ont probablement jamais travaillé sur des systèmes embarqués, où malloc renvoyant 0 est une possibilité très réelle. Sur un système sur lequel je travaille actuellement, il y a un total de 4,25 K octets de RAM (soit 4352 octets). J'alloue 64 octets pour la pile et j'ai actuellement un tas de 1600 octets. Pas plus tard qu'hier, je déboguais une routine de marche en tas pour pouvoir suivre l'allocation et la libération de mémoire. La marche en tas utilise un petit tampon (30 octets) alloué statiquement pour sortir sur un port série. Il sera désactivé pour la version finale.
Comme il s'agit d'un produit de consommation, il vaut mieux ne pas manquer de mémoire une fois le produit sorti. Je suis sûr que ce sera le cas pendant le développement. Dans tous les cas, tout ce que je peux faire est de biper le haut-parleur plusieurs fois et de forcer un redémarrage.
la source
Pour être honnête, dans tous les projets que j'ai réalisés (gardez à l'esprit que je ne travaille encore nulle part), je n'ai jamais pensé que cela pourrait arriver, et donc je suppose que mes programmes mourraient très rapidement.
En outre, la gestion d'un MOO nécessite que vous ayez préalloué les ressources pour afficher le message d'erreur ou pour tout enregistrer, ce qui peut être assez gênant.
Je pense que ces jours-ci, la mémoire coûte moins cher que les arachides, ce n'est pas quelque chose qui devrait se produire fréquemment. À l'aube de la mémoire protégée et avant, c'était peut-être une préoccupation, mais maintenant? Les seules erreurs de MOO que j'ai jamais vues proviennent du code buggé.
la source
La vérification des codes de retour malloc est généralement inutile de toute façon.
Les systèmes d'exploitation modernes surchargent la mémoire: ils donnent aux processus plus de mémoire que ce qui est réellement disponible. La mémoire accordée à votre processus est virtuelle, le tout mappé sur une seule page mise à zéro.
Ce n'est que lorsque vous écrivez dans la mémoire qu'une page physique unique est allouée à vos processus. Si cette allocation échoue, le noyau terminera un processus (peut-être le vôtre!) Pour tenter de trouver de la mémoire. À ce stade, vous ne pouvez plus rien faire.
la source
À moins que vous ne développiez pour des systèmes embarqués, des systèmes en temps réel ou des systèmes qui sont si critiques que les pannes peuvent coûter des vies, ou des milliards de dollars ... Alors cela ne vaut probablement pas la peine financièrement de s'inquiéter des conditions de mémoire insuffisante.
Dans la plupart des cas, il y a peu de choses à faire lorsque vous manquez de mémoire de toute façon, car il n'y a pas de mémoire pour créer de nouveaux objets ou effectuer des tâches qui peuvent faire quelque chose. Vous devez peser le coût de l'application gérant le MOO par rapport aux avantages que vous en retirez.
la source
Je vérifierais toujours les erreurs. Si quelque chose renvoie une condition d'erreur, elle doit être gérée par votre programme. Même si c'est un message qui dit "Mémoire insuffisante, je dois y aller!", C'est mieux que "Violation d'accès", "vidage de mémoire" ou autre. L'une est une condition d'erreur que vous gérez, l'autre est un bogue. Et l'utilisateur le percevra également comme tel.
Pour votre cas spécifique, vous pouvez essayer d'annuler l'opération, libérer les ressources que vous avez allouées jusqu'à atteindre le point d'échec, signaler l'erreur et poursuivre l'exécution (peut-être lorsque vous essayez de quitter l'application, vous pouvez donner la option pour quitter immédiatement). De cette façon, l'utilisateur peut décider quoi faire, ou essayer de libérer de la mémoire en tripotant, en fermant des fichiers, etc. Bien sûr, la façon dont vous pouvez gérer la situation dépend fortement de votre programme - un programme qui n'est pas censé be interactive a probablement juste besoin de consigner l'erreur et soit de quitter, soit de continuer.
la source