Qu'est-ce que l'idéal de l'utilisation de std::nothrow
?
Réponses
Trop de publicités?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.
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.)
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.