2010-11-29 1 views
5

En C++, can permet d'appeler une fonction à chaque fois que new échoue. Est-il possible d'appeler une fonction à chaque fois que malloc échoue? Supposons que malloc est appelé à partir de bibliothèques tierces que je ne veux pas modifier.Existe-t-il un équivalent de set_new_handler() pour les échecs malloc()?

Je ne pense pas qu'il y ait une réponse portable, donc j'accepte volontiers les plates-formes spécifiques. J'utilise Linux + uclibc sur certaines plateformes et Linux + glibc sur d'autres. Je prévois d'utiliser pour limiter la quantité de mémoire malloc peut retourner.

+0

Nous Supposons que vous avez désactivé votre engagement. Droite? –

+0

Conrad: J'espère, mais je ne possède pas tout le système, je fournis juste une application. Les gens qui ont conçu le système m'ont promis une certaine quantité de RAM et, en retour, je dois promettre de rester dans cette limite. (Ceci est un périphérique intégré sans échange, donc les gens prennent très au sérieux les budgets de la mémoire et s'assurent que tout va bien). – user9876

Répondre

11

malloc renvoie NULL en cas d'échec. Vous devriez gérer cela, et d'autres échecs des fonctions de mémoire CRT (realloc surtout est facile de se tromper).

Dans le cas général, je pense que vous devriez envelopper toute l'utilisation de la mémoire CRT dans les fonctions de votre propre conception pour rediriger sur erreur.

Sur Windows, vous pouvez vous connecter au CRT en utilisant Allocation Hook Functions, ce qui pourrait être un moyen de faire ce que vous voulez. Cela vous donne un crochet pour gérer les appels CRT via la logique pour onalloc, onrealloc, onfree, efficacement.

Je ne fais aucune garantie puisque je suis un gars Windows mais il ressemble à malloc_hook on Linux offre le même que ce que le crochet Windows permet. Ces méthodes devraient vous permettre de capturer tous les appels de mémoire CRT sans changer le code dans les bibliothèques tierces, en supposant qu'ils utilisent tous le même CRT à l'exécution - toujours une bonne idée, mais pas garanti sur Windows au moins ...

+0

Oui, '__malloc_hook()' est la fonction correcte sous Linux (glibc au moins - je ne sais pas sur uclibc). – caf

+0

A partir d'une page de manuel plus récente: «L'utilisation de ces fonctions de hook n'est pas sûre dans les programmes multithread, elles sont désormais obsolètes. "." http://www.kernel.org/doc/man-pages/online/pages/man3/malloc_hook.3.html – user9876

Questions connexes