27 votes

Quand doit-std::nothrow être utilisé?

Qu'est-ce que l'idéal de l'utilisation de std::nothrow?

10voto

Steve Jessop Points 166970

J'aimerais l'utiliser seulement comme une optimisation (ou de la simplification du code) quand j'autrement auraient du mettre un bloc try-catch immédiatement autour d'une utilisation régulière de nouveaux, attraper std::bad_alloc.

Il s'agit d'une situation rare, car il est rare de pouvoir utilement poignée de droite de mémoire il y a sur le site d'appel. Habituellement, vous devez allouer de la mémoire parce que vous en avez besoin, pas parce que tu aimerais avoir, mais peut vivre sans. Code qui passe pointeurs null sauvegarder une chaîne d'appels jusqu'à ce que finalement quelqu'un peut traiter le problème n'est pas idiomatique C++.

Il peut arriver cependant que l'erreur véritablement peuvent être traitées immédiatement. Par exemple, vous pourriez être dans une situation où vous aurez à utiliser un algorithme ou de la technique de suffisamment d'espace de travail, et un autre, plus lente de l'algorithme ou de la technique sans. Puis de nouveau, seriez-vous de l'affectation de l'espace de travail directement avec new? Pas normalement. Et de toute façon, vous devez parfois être prudent avec cette approche, parce que si votre système d'exploitation overcommits puis en général, vous ne peut pas gérer de la mémoire gracieusement au niveau de l'application.

Notez qu'une expression impliquant std::nothrow peut encore lever une exception (en particulier à partir de n'importe quel constructeur de l'objet alloué), il est seulement une chose nécessaire si vous êtes l'espoir d'éviter de lancer une exception. Vous devez également vous assurer que le constructeur ne sera pas levée.

Pour autant que je suis concerné, les jours de programmes C++ qui n'utilisent pas des exceptions à tout, sont plus. Je suppose que si ils ont repris pour moi, en raison de certains particulier style de guide, alors que c'est l'autre raison pour avoir besoin de nothrow nouveau.

9voto

Puppy Points 90818

Si je comprends bien, à peu près jamais et à aucun.

9voto

TonyK Points 8604

Portage d'un programme C de C++. Votre programme C a tous ceux qui vérifie là, après chaque malloc, et aucune notion d'exceptions. Il est donc beaucoup plus simple de changer chaque malloc pour new (nothrow) que pour l'envelopper chaque malloc dans un bloc try.

4voto

chrisaycock Points 12900

Peut-être que si votre application requise nano-optimisation et de ne pas permettre à la surcharge de la gestion des exceptions, alors peut-être nothrow serait nécessaire.

Gardez à l'esprit que Stroustrup est assez catégoriquement que le programmeur peut désactiver les frais généraux en C++. (Comme une mise en garde cependant, juste parce que vous avez le choix ne signifie pas que vous devriez.)

4voto

Crazy Eddie Points 23778

Vous utiliser std::nothrow lorsque vous voulez avoir à vérifier la valeur null après chaque nouvelle. Beaucoup de code hérité nécessaire lorsque la première version de la norme a été faite. Beaucoup de l'héritage du code écrit par la suite l'utiliser aussi parce que les gens là où paranoïaque des exceptions. Occasionnellement, vous allez rencontrer quelqu'un qui l'est toujours.

Il est donc très rare que vous ne voulez vraiment faire ce qu'il m'a fallu une seconde pour rappeler WTF vous étiez en train de parler.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X