Bien que cela ne se produise pas souvent, il y a quelques cas où mon application Cocoa allouera de très grandes quantités de mémoire, assez pour me faire craindre d'un échec de malloc. Quelle est la meilleure façon de gérer ce genre d'échec dans une application Cocoa? J'ai entendu dire que les exceptions sont généralement découragées dans cet environnement de développement, mais est-ce un cas où elles seraient utiles?Meilleure façon de gérer l'échec de malloc dans Cocoa
Répondre
Si l'allocation échoue en raison d'un manque de mémoire, il est probable qu'une erreur d'allocation s'est produite dans un cadre où l'application est restée dans un état indéterminé.
Même si ce n'est pas le cas, vous ne pouvez pas faire quoi que ce soit qui va allouer de la mémoire et qui vous laisse avec très peu d'options.
Même libérer de la mémoire pour essayer de "réparer" le problème ne fonctionnera pas toujours, même pas pour "réparer" le problème en affichant un message d'erreur gentil et en sortant proprement.
Vous ne voulez pas non plus essayer d'enregistrer des données à partir de cet état. Ou, au moins, pas sans écrire tout le code nécessaire pour traiter les données corrompues à la lecture (car il est tout à fait possible qu'une allocation échouée signifie du code quelque part corrompu de la mémoire). Traitez les échecs d'allocation comme étant fatals, consignez et quittez.
Il est extrêmement rare pour une application correctement écrite pour manquer de mémoire. Plus probablement, aussi, quand une application manque de mémoire, le système de l'utilisateur va paginer comme un enfer et, par conséquent, les performances se sont dégradées de manière significative bien avant l'échec de l'allocation. Votre retour sur investissement pour vous concentrer sur l'optimisation et la réduction de l'utilisation de la mémoire sera beaucoup plus important que si vous essayez de vous remettre d'un échec d'allocation.
(La réponse originale d'Alan était exacte ainsi que son édition).
Si vous rencontrez des erreurs d'allocation de mémoire, vous ne devriez pas essayer de les gérer, mais plutôt de repenser la façon dont votre application utilise la mémoire. Je ne suis pas sûr de ce que sont les idiomes Cocoa, mais pour C++ et C# au moins, les exceptions de mémoire insuffisante sont un signe de problèmes plus importants et sont mieux laissés à l'utilisateur/système d'exploitation à traiter.
Dites que l'allocation de mémoire échoue, que peut faire votre système? Combien de mémoire reste-t-il? Est-ce suffisant de montrer une boîte de dialogue/imprimer un message, avant de fermer? Lance une exception réussie? Le nettoyage des ressources entraînera-t-il des exceptions de mémoire en cascade?
Si malloc échoue, vous obtiendrez un retour à zéro, donc si c'est le cas, votre application peut-elle continuer sans la mémoire? Si ce n'est pas le cas, traitez la condition comme une erreur fatale et quittez avec un message utile.
Si vous manquez de mémoire, il n'y a généralement pas grand-chose à faire pour mettre fin à votre application. Même afficher une notification peut échouer car il n'y a pas assez de mémoire pour cela.
La norme dans les applications C est d'écrire une fonction void xmalloc(size_t size);
qui vérifie la valeur de retour de malloc, et si NULL, imprime une erreur à stderr puis appelle abort(). De cette façon, vous utilisez simplement xmalloc
dans votre code et n'y pensez pas. Si vous manquez de mémoire, la malchance et votre application vont mourir.
- 1. meilleure façon de gérer JSON dans django
- 2. meilleure façon de gérer dom que DOMCategory?
- 3. Meilleure façon de gérer les messages d'erreur
- 4. Meilleure façon de gérer différents types d'utilisateurs?
- 5. meilleure façon de gérer les ressources
- 6. Meilleure façon de gérer les erreurs
- 7. Meilleure façon de gérer une exception KeyNotFoundException
- 8. Meilleure façon de gérer le dépôt git
- 9. Meilleure façon de faire des animations UILabel dans Cocoa Touch?
- 10. Meilleure façon de gérer les variables de requête dans Django
- 11. La meilleure façon de gérer un changement dans 'ceci'
- 12. Meilleure façon de gérer les événements chronométrés dans PyGame
- 13. Meilleure façon de gérer ListViewItems dans un ListView détaillé?
- 14. Meilleure façon de gérer les paramètres utilisateur dans un programme
- 15. Meilleure façon de gérer les données relationnelles dans CodeIgniter?
- 16. Meilleure façon de gérer RoutingError dans Rails 2.1.x?
- 17. Meilleure façon de gérer la session dans NHibernate?
- 18. Meilleure façon de gérer plusieurs dispositions dans symfony
- 19. Meilleure façon de gérer le multitenancy dans Rails 3
- 20. Meilleure façon de gérer la table de relations Nhibernate
- 21. Meilleure façon de gérer les extraits de code sous Linux?
- 22. Meilleure façon de gérer plusieurs colonnes de défilement
- 23. Meilleure façon de gérer une exception de précondition type?
- 24. Meilleure façon de gérer les objets de date?
- 25. Meilleure façon de gérer les propriétés de conservation
- 26. La meilleure façon d'utiliser XML-RPC dans l'application Cocoa?
- 27. ASP.NET: Meilleure façon de gérer les ressources globales?
- 28. Meilleure façon de gérer les contrôles HTML courants sur ASP.NET
- 29. Meilleure façon de gérer une liste d'email. NET
- 30. Meilleure façon de gérer les fichiers utilisateur côté serveur?
Ne vous inquiétez-vous pas lorsque vous allouez de grandes quantités de mémoire? Une simple notification "Vous n'avez plus de mémoire" est plus conviviale qu'une erreur de segmentation (bien sûr, pas assez pour vérifier chaque mauve). –
Vous soulevez un bon point. – Alan