comment tester si auto pointeur est null?
Je suis nouveau sur pointeur automatique. J'ai ceci:
std::auto_ptr<myClass> myPointer(new MyClass(someArg));
Comment puis-je vérifier si je peux instancier myPointer
avec succès? J'ai essayé if (myPointer==NULL)
et le compilateur émis une erreur:
aucun opérateur "==" correspond à ces opérandes.
Toujours essayer de reproduire les messages d'erreur textuellement dans leur intégralité. Normalement le compilateur aura abandonné tous sans importance bits avant d'arriver à les voir.
Sérieusement, que voulez-vous dire par "instancier" ici?
Je pense que si je peux instancier myPointer avec succès signifie si myPointer a été créé avec succès. La question et ses réponses - plus de toutes les l'un de Légèreté Courses en Orbite - peut-être même mieux sans cette source de distraction.
Rappelez-vous le Rasoir d'Occam les gars (et les filles). Le Code affiché est souvent garni de réduire le niveau de verbosité, et il n'est pas nécessairement pour que la répartition de myPointer est immédiatement suivie par la valeur NULL/nullptr test.
Si l'OP "garnis" le code de sorte qu'il n'est pas réellement démontrer le problème, c'est l'opposé de Rasoir d'Occam. Il est également tout à fait inutile comme question.
Sérieusement, que voulez-vous dire par "instancier" ici?
Je pense que si je peux instancier myPointer avec succès signifie si myPointer a été créé avec succès. La question et ses réponses - plus de toutes les l'un de Légèreté Courses en Orbite - peut-être même mieux sans cette source de distraction.
Rappelez-vous le Rasoir d'Occam les gars (et les filles). Le Code affiché est souvent garni de réduire le niveau de verbosité, et il n'est pas nécessairement pour que la répartition de myPointer est immédiatement suivie par la valeur NULL/nullptr test.
Si l'OP "garnis" le code de sorte qu'il n'est pas réellement démontrer le problème, c'est l'opposé de Rasoir d'Occam. Il est également tout à fait inutile comme question.
OriginalL'auteur user853069 | 2011-08-15
Vous devez vous connecter pour publier un commentaire.
Qu'entendez-vous par "instancier"?
Sur un conforme à la norme de mise en œuvre, soit la construction de la
MyClass
réussi, ou une exception a été levée et leauto_ptr
de ne plus être dans la portée. Ainsi, dans l'exemple que vous avez fourni, la valeur du pointeur représenté par votreauto_ptr
ne peut pas êtreNULL
.(Il est possible que vous soyez à l'aide d'une mise en œuvre sans exception, qui peut renvoyer
NULL
sur l'échec d'allocation (au lieu de lancer une exception), même sans l'utilisation de la(nothrow)
prescripteur, mais ce n'est pas le cas général.)En parlant de façon générale, vous peut vérifier la valeur du pointeur. Vous avez juste à obtenir à la représentation sous-jacente, parce que, comme vous l'avez découvert,
std::auto_ptr
ne dispose pas d'unoperator==
.Pour ce faire, utilisez
X* std::auto_ptr<X>::get() const throw()
, comme ceci:Également noter que
std::auto_ptr
est obsolète dans C++0x, en faveur destd::unique_ptr
. Préfère le dernier endroit où vous avez accès à une mise en œuvre conforme.new
peut retourner la valeur NULL). C'est beaucoup plus commun que les gens aiment bien l'admettre.Est valable sans préciser
(nothrow)
? @Zack: Semble c'est seulement pour les non-conforme compilateurs, et je ne suis pas gêné à ce sujet. Cette question est sur le C++.Geret'kal Sur les compilateurs qui ne supportent pas les exceptions, on n'a pas besoin d'appeler le
std::nothrow
version denew
. Soit appel renvoie la valeur NULL si l'allocation échoue.Même dans les environnements embarqués, la gestion des exceptions est désactivé pour beaucoup de la vraie, de la production de code (par exemple, je peux en témoigner personnellement que les deux Firefox, Webkit et le faire, et j'ai entendu dire que c'est aussi le cas pour OpenOffice). Oui, c'est un non-conformes à la mode pour le compilateur. Oui, cela signifie une grande partie de la bibliothèque standard est inutilisable ou ne se comporte pas comme documenté. C'est encore le C++ comme elle est parlait, et je crois qu'il nous appartient de nous (answerers de StackOverflow questions) pour être au courant de cela.
Seulement si vous souhaitez gérer le
std::bad_alloc
. Habituellement, vous n'avez pas pris la peine: si vous avez à court de mémoire, il n'y a pas beaucoup de point de continuer à exécuter le programme. Laisser bouillonner àmain
et de mettre fin à votre processus. (L'utilisation destd::auto_ptr
n'est pas liée à cet aspect dynamique de l'allocation des objets.)OriginalL'auteur Lightness Races in Orbit
Comment à ce sujet?
OriginalL'auteur Tae-Sung Shin
Je pense que
myPointer.get() == NULL
est ce que vous cherchez.OriginalL'auteur Jon
Compte tenu de la déclaration que vous avez écrit dans votre question soit myPointer ou une exception a été levée et la capture de l'exception est la bonne façon de vérifier si quelque chose allait mal.
En tout cas, vous pouvez obtenir le sous-jacent pointeur en appelant
auto_ptr::get()
.OriginalL'auteur Nicola Musatti
Lors de la vérification d'un
std::auto_ptr
pourNULL
, je pense que c'est plus idiomatique notation:OriginalL'auteur Wolf