Attraper une Violation d'Accès Mémoire en C++
En C++, est-il un moyen standard (ou de toute autre manière, d'ailleurs) pour attraper une exception déclenchée par une violation d'accès mémoire?
Par exemple, si quelque chose va mal et le programme essaie d'accéder à quelque chose qu'il n'était pas censé, comment voulez-vous obtenir un message d'erreur s'affiche en disant: "Violation d'Accès Mémoire!" au lieu de terminer le processus et de ne pas montrer à l'utilisateur toutes les informations au sujet de l'accident?
Je suis de la programmation d'un jeu pour Windows avec MinGW, si ça peut aider tout.
Pourquoi quelqu'un voudrait-il empêcher un fou furieux programme qui tentent de modifier la mémoire protégée par la fin ?
En général, vous n'avez pas "attraper" ces, à vous de les corriger de se produire en premier lieu en cours d'exécution par le biais d'un débogueur, tels que GDB.
Je pense qu'il a juste envie de montrer soigné de la fenêtre de sortie au lieu de la valeur par défaut la fenêtre de l'OS, puis de le laisser mettre fin de toute façon. Rien de mal à cela.
Il n'y a pas de moyen de le récupérer à partir. Puisque vous ne savez même pas si la pile d'appel est sain d'esprit à ce point, en jetant une des exceptions C++ (qui doit se détendre de la pile et de détruire les objets concernés) n'est pas vraiment possible. D'ailleurs, que voulez-vous écrire dans le gestionnaire que vous êtes certains est sûr?
Dans l'intérêt de la clarté: à partir d'un C++ perspective, l'accès à la mémoire non allouée est un comportement indéterminé, pas une exception. Il peut ou peut ne pas être une exception au niveau du système d'exploitation, par exemple, une violation d'accès dans Windows ou une erreur de segmentation dans Linux. Vous pouvez être en mesure de signaler ceux que zakinster suggéré.
En général, vous n'avez pas "attraper" ces, à vous de les corriger de se produire en premier lieu en cours d'exécution par le biais d'un débogueur, tels que GDB.
Je pense qu'il a juste envie de montrer soigné de la fenêtre de sortie au lieu de la valeur par défaut la fenêtre de l'OS, puis de le laisser mettre fin de toute façon. Rien de mal à cela.
Il n'y a pas de moyen de le récupérer à partir. Puisque vous ne savez même pas si la pile d'appel est sain d'esprit à ce point, en jetant une des exceptions C++ (qui doit se détendre de la pile et de détruire les objets concernés) n'est pas vraiment possible. D'ailleurs, que voulez-vous écrire dans le gestionnaire que vous êtes certains est sûr?
Dans l'intérêt de la clarté: à partir d'un C++ perspective, l'accès à la mémoire non allouée est un comportement indéterminé, pas une exception. Il peut ou peut ne pas être une exception au niveau du système d'exploitation, par exemple, une violation d'accès dans Windows ou une erreur de segmentation dans Linux. Vous pouvez être en mesure de signaler ceux que zakinster suggéré.
OriginalL'auteur rsethc | 2013-05-17
Vous devez vous connecter pour publier un commentaire.
Access violation
est un matériel d'exception et ne peut pas être pris par une normetry...catch
.Depuis la manipulation de matériel d'exception sont spécifiques au système, toute solution de l'attraper à l'intérieur du code serait également spécifiques au système.
Sur Unix/Linux, vous pouvez utiliser une
SignalHandler
faire attraper leSIGSEGV
signal.Sur Windows vous pourriez attraper ces structured exception à l'aide de la
__try/__à l'exception de
déclaration.Qui semble raisonnablement réalisable s'ils sont deux processus différents.
Je pense qu'il pourrait également être intéressant de mentionner qu'il existe des systèmes sans MMU (ou MPU) qui ne peuvent pas détecter une violation d'accès mémoire à tous.
OriginalL'auteur zakinster
Ce n'est pas tout à fait vous aider à, mais des violations d'accès et d'autres SEH des exceptions peuvent être pris dans MSVC à l'aide de
try
...catch(...)
, si vous compilez avec/EHa
:Démonstration en direct
De sortie:
Le seul inconvénient est que vous n'avez aucun moyen de savoir ce qui s'est passé. Pour en savoir plus sur l'exception que vous pouvez personnaliser la SEH traducteur fonction avec _set_se_translator comme dans cet article.
Comment puis-je savoir si mon projet est MSVC?
OriginalL'auteur rustyx