Lorsque dynamic_cast va lever une exception en cas utilisé avec le pointeur?
Je suis à l'aide de dynamic_cast dans ma source de jeter pointeur comme quelque chose comme ci-dessous,
Base *base = here storing the pointer;
Derived *derived = dynamic_cast<Derived*>(base);
Dans le cas de la base n'a pas le pointeur de la hiérarchie de classe puis conversion échoue et renvoie la valeur NULL. Dans les prochaines lignes, je suis à la vérification de la valeur NULL. Donc pas de problèmes.
Je suis tombé sur un vidage sur incident, ma demande s'est écrasé en raison de la dynamic_cast throws exception.
Je sais dynamic_cast va lancer uniquement lorsqu'il est utilisé avec les types de référence.
Une idée de quand le dynamic_cast peut jeter l'exception lorsqu'il est utilisé avec pointeur que j'ai utilisé ci-dessus source?
OriginalL'auteur Rajesh Subramanian | 2013-05-10
Vous devez vous connecter pour publier un commentaire.
Dans un programme bien défini, il ne peut pas. La norme ne permet pas:
Cependant, si vous passez
dynamic_cast
un pointeur non valide, puis vous appelez comportement indéfini et rien peut arriver, y compris certains de la mise en œuvre définies par des exceptions C++, ou un crash d'exécution.OriginalL'auteur Lightness Races in Orbit
dynamic_cast<Derived*>
pouvez jeter si le pointeur est passé (base
) n'est pas valide, puisquedynamic_cast
besoins de déréférencement d'elle afin de connaître son type dynamique.EDIT: Pour être plus précis.
dynamic_cast
ne sera jamais jeter une exception structurée (std::bad_cast
, par exemple) lorsqu'il est utilisé avec des pointeurs, mais il ne sera probablement jeter un non structuré exception que vous ne peut pas l'attraper lorsqu'il est passé d'un pointeur non valide. À l'aide de pointeurs invalides provoque un comportement indéterminé, qui dans ce cas signifie généralement l'accès à la mémoire non valide et un crash.Basé sur le vidage de la mémoire que vous avez connecté à votre question, il est clair que
pInfo
points d'un objet non valide, par conséquent tous ceux<Memory access error>
messages. Cela signifie quepInfo
est un pointeur non valide et c'est la raison pourquoi votre programme se bloque. Vous avez un bug quelque part et que vous devrez le réparer.Un pointeur non valide est un pointeur qui ne pointe pas vers un objet, ni la valeur est null. Si
base
pointant vers un détruits, objet ou n'a pas été initialisé avec l'adresse d'un objet, il n'est pas valide.Dans mon cas, à partir de la crashdump j'ai trouvé que l'objet n'est pas nulle; parce que, avant cette distribution, j'ai une condition pour vérifier la valeur null.
Si elle est nulle, vous n'avez pas de problème: un
dynamic_cast
null donne toujours la valeur null. Mais c'est le pointeur pointant sur un objet valide? Un objet valide est celui qui a été construit mais pas encore détruit.L'objet n'est pas null. Mais quelques-uns des membres les valeurs qu'il contient ne sont pas accessibles. Fera que rendre le dynamic_cast pour devenir un échec? J'ai joint la fenêtre d'observation de cet objet à partir de windbg dans ma réelle question maintenant. (pInfo) est l'objet passé en dynamic_cast.
OriginalL'auteur Gorpik