2009-12-28 5 views
3

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

5

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).

1

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.

+0

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). –

+0

Vous soulevez un bon point. – Alan

0

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.

Questions connexes